Область действия приватной статической переменной в нестатическом классе - PullRequest
0 голосов
/ 14 января 2019

Я знаю, что статическое свойство может сохранять свое значение, пока приложение продолжает работать. Будет ли это так же для частного статического поля внутри нестатического класса

public class A
{
   private static int B;

   public int GetSession()
   {
     return B++;
   }
}

В вышеприведенном классе у меня есть личное статическое поле. Будет ли метод GetSession() вызывать число обращений к GetSession()?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Поскольку B равно static, оно будет общим между всеми сеансами; поточно-ориентированный (что, если два сеанса пытаются получить к нему доступ / увеличить одновременно ?) реализация -

   public int GetSession()
   {
       return Interlocked.Increment(ref B);
   }

Редактировать: Если мы хотим эмулировать B++, а не ++B (и возвращать B до увеличения - см. Комментарий Джеппа Стига Нильсена), мы можем просто вычесть 1

   public int GetSession()
   {
       // - 1 Since we want to emulate B++ (value before incrementing), not ++B
       return Interlocked.Increment(ref B) - 1;
   }
0 голосов
/ 14 января 2019

Да, он будет указывать количество вызовов метода GetSession().

Всего будет всех экземпляров A.

Обратите внимание, что это не потокобезопасно, поэтому, если ваше приложение имеет несколько потоков, потенциально вызывающих GetSession() одновременно, счет может быть неправильным. Смотрите ответ Дмитрия Быченко. Это не проблема, если все ваши экземпляры A вызываются из одного потока.

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

0 голосов
/ 14 января 2019

Да, он по-прежнему будет возвращать количество обращений к B. Это все еще static. Добавление частного не меняет этого. И создание класса static означает, что объект не может быть создан для этого класса, поэтому все в классе должно быть static. Но переменная будет вести себя так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...