C # Статические члены - PullRequest
       20

C # Статические члены

0 голосов
/ 15 февраля 2012

У меня есть вопрос относительно статических членов и функций нестатических классов.

У меня есть статический член в моем классе, который я использую для аутентификации.По сути, я вызываю статическую функцию из своего веб-приложения, а затем внутри я вызываю статическую функцию, которая присваивает значение этому статическому члену.Теперь мой вопрос заключается в том, будет ли каждый вызов статической функции из моего веб-приложения создавать новую ссылку на объект и назначать новое значение статическому члену.

Так что в основном у меня есть это:

public class ClassA
{
     private static int UserId;

     private static AssignIdToUser(string token)
     {
         UserId = <int value depending on result of db query>;
     }

     public SendMessage(string token, string message, string toaddress)
     {
         AssignIdToUser(token);
         Message msg = new Message(); //This is just a sample of a class that is similar to the one I use
         msg.Message = message;
         msg.UserId = UserId;
         msg.ToAddress = toaddress;
         //add class to db and save
     }
}

Затем в своем веб-приложении я могу сделать:

ClassA.SendMessage("userstoken", "This is a message", "0123456789");

Теперь, если два пользователя одновременно войдут в систему и будет вызвана функция, будет ли для элемента UserId правильное значение длякаждый пользователь?

По сути, это экземпляр объекта, созданного для каждого запроса, или же используется тот же объект?

Ответы [ 4 ]

4 голосов
/ 15 февраля 2012

Экземпляр статического члена будет существовать для каждого AppDomain, если вы не укажете [ThreadStatic], в этом случае он будет для потока, но всегда для типа (примечание , дженерики играют на этом очень сильно!)

Статические члены не являются хорошим выбором для веб-приложений, поскольку IIS регулярно перезаписывает домены приложений. Вы будете терять статическое электричество каждый раз, когда оно перерабатывается.

Действия пользователя обычно хранятся в состоянии Session, я бы начал здесь. Предполагая ASP.NET:

Состояние сеанса на MSDN

Состояние приложения на MSDN

1 голос
/ 15 февраля 2012

Нет, статический член является общим для всех экземпляров, поэтому идентификатор пользователя будет непредсказуемым.Лучше было бы, чтобы ваша функция назначения возвращала идентификатор пользователя, тогда вы должны иметь правильное значение для каждого вызова.

т.е.

var userId = AssignIdToUser(token);
....
msg.UserId = userId;
1 голос
/ 15 февраля 2012

Значения в статических полях распределяются между запросами. Используйте поле экземпляра и каждый раз создайте новый экземпляр объекта или передайте метод UserId методу.

0 голосов
/ 15 февраля 2012

Используемые вами функции не сохраняют потоки.

Если у вас есть два объекта, два разных потока (T1 и T2), выполняющиеся одновременно, может случиться так, что первый вызов SendMessage () (например, в T1) будет прерван сразу после AssignIdToUser (). Если теперь T2 запланирован и завершает один вызов SendMessage (), метод SendMessage () в T1 будет использовать тот же идентификатор пользователя, что и метод SendMessage в T2.

Вы не должны использовать статические переменные в этом месте. Но вы можете использовать статическую функцию, например, такую:

 private static int getUserIdForToken(String token) {
     ...
     return <int value depending on result of db query>;
 }
...