Статический класс внутри нормального класса для ASP.Net - PullRequest
2 голосов
/ 24 марта 2011

Я знаю, что создание статического класса в проекте ASP.Net приведет к тому, что свойства среды выполнения этого класса будут доступны для всех сеансов на веб-сервере.

У меня такой вопрос: если я объявляю вложенные классы статическими, но не контейнер, применяется ли совместное использование классов между сеансами?

Пример:

 public class FooContainer 
    {

        public static class Bar
        {
        }

        public static class dog
        {
        }
    }

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

Да; статический вложенный класс ведет себя так же, как и любой другой статический класс. Единственный раз, когда вложенные классы ведут себя по-разному, это когда внешний класс имеет универсальный тип (тогда вложенный тип неявно является универсальным через родительский тип, поэтому FooContainer<X>.Bar будет независимым от FooContainer<Y>.Bar).

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

2 голосов
/ 24 марта 2011

В конечном итоге, да.

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

1 голос
/ 24 марта 2011

Когда я вижу, что кто-то говорит "статические данные" и "ASP.NET" в одном предложении, все виды предупреждений отключаются.

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

MyStaticClass.StaticField = 3; ///wont work
MyInstanceClass.MyStaticClass.StaticField = 3; // works

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

Но будьте осторожны, статические классы в ASP.net полностью статичны на уровне приложения, поэтому, если у вас несколько пользователей, они все увидятодни и те же статические данные, независимо от полномочий, и изменение этих данных повлияет на всех пользователей, которые их используют.
Таким образом, статическая переменная может быть подходящим местом для размещения чего-то, что читается один раз из БД, а затем просто отображается,т.е. текущая версия приложения или время запуска приложения, , но это очень неправильное место для пользователяконкретные данные , такие как языковые предпочтения, имена пользователей и т. д. и т. д. *

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