Поведение статической переменной класса в ASP.NET 2.0? - PullRequest
2 голосов
/ 21 июня 2011

Если я определил этот класс как часть приложения в ASP.NET 2.0:

public class Foo
{
   private static int _seed = 100;
   private static object myLock = new object();
   public Foo()
   {
      lock (myLock)
      {
         this.MyInt = _seed;
         _seed++;
      }
   }

   public int MyInt {get; set;}
}

(Изменить: обновлен с учетом проблем безопасности потоков, как указано в ответах)

Как поведет себя этот статический член?Будет ли он начинаться с 100 и будет увеличиваться отдельно для каждого сеанса или будет увеличиваться отдельно для каждого обновления страницы, или это глобально ...?

Примечание. Я спрашиваю об этом, потому что использую классы дляВпервые я смоделировал данные в моем приложении ASP.NET, и я уже обнаружил, что характер ссылок в C # по-видимому игнорируется сериализацией ViewState, поэтому я хочу знать, какие еще странности я могу ожидать.Например, если у меня определен этот класс (предположим, Bar - это другой класс):

public class OtherFoo
{
   public List<Bar> Bars {get; set;}
}

, и я делаю это на своей странице:

OtherFoo _myFoo = new OtherFoo();
//Code here to instantiate the list member and add some instances of Bar
Bar b = _myFoo.Bars[0];
ViewState["myFoo"] = _myFoo; //Assume both are [Serializable]
ViewState["myBar"] = b;

Когда я получу ихViewState при следующей обратной передаче, b и _myFoo.Bars[0] больше не являются одним и тем же объектом.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

ASP.NET не волшебство. Он волшебным образом не превращает язык программирования C # (или любой другой язык) в язык, который знает о веб-разработке (сеансы, запросы и т. Д.).

Ваш код будет вести себя точно , как и в любом другом приложении, за исключением того, что он может быть вызван несколькими потоками одновременно (поэтому использование "++" небезопасно ).


Опять нет магии. Как и у любого другого приложения, время жизни статики ограничено временем жизни домена приложения, в который загружен тип, содержащий статические данные.

Домен приложения в приложении ASP.NET создается при первом обращении к приложению (если только настройки IIS не заставляют его запускаться заранее) и заканчивается только в определенное время, например, когда сборка в папке bin или web.config, или когда в настройках IIS указано, что AppPool необходимо утилизировать.

1 голос
/ 22 июня 2011

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

Десериализация вызовет конструктор (по умолчанию).Если вы сериализуете его в ViewState, то ASP.NET будет десериализовать объект при обратной передаче и, таким образом, вызовет конструктор.

Обратите внимание, что язык C # и инфраструктура asp.net находятся на совершенно другом уровне.Фреймворк написан (в основном) на C #, и он многое сделает для вас за кулисами, но он все еще следует правилам языка и среды выполнения.

Сериализация - не более чем кодирование информацииобъект (или граф объектов) в поток.Если вы десериализуете его, вы получите ту же информацию, но это не тот объект, с которого вы начали.Опять же, это не волшебство, вы можете написать свою собственную библиотеку сериализации, используя атрибуты и рефлексию.

...