члены static и const, статические классы и узкие места - PullRequest
2 голосов
/ 04 марта 2012

У меня два вопроса о static + const членах и static классах.

Один: Почему вы объявляете класс, который имеет все статические и константные члены, а не делает класс статическим?

Я изучал .net-код в отражателе в качестве учебного упражнения.Класс, который я изучаю, демонстрирует этот дизайн - класс FormsAuthentication.Все его члены помечены static или const, но сам класс помечен public sealed Единственный нестатический член в классе - это конструктор по умолчанию без реализации.Почему этот класс не был помечен public static sealed?

Мой второй вопрос касается того, почему члены класса FormsAuthentication объявлены как static.Насколько я понимаю, в приложении AppDomain может быть много HttpApplications, и все эти HttpApplications будут использовать одни и те же FormsAuthentication статические члены классов.

Два: Разве это не вызываетгорлышко бутылки?Если так, то почему это так?

1 Ответ

4 голосов
/ 04 марта 2012

Причина в том, что FormsAuthentication - это класс, который предшествует статическому классу.Он был представлен в .Net 1.1, в которой не было понятия статических классов.Поскольку класс работает, и его изменение сейчас бесполезно, его, вероятно, никто не собирается пересматривать, чтобы удалить частный ctor и сделать его статическим, а не запечатанным.

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

Единственное узкое место - это вероятная блокировка за кулисами, поскольку .Net обычно обеспечивает безопасность потоков для статических членов.Реально, хотя это вряд ли вызовет проблемы;у него также может быть локальное хранилище потоков, поэтому он может вообще не блокироваться.Вы должны были бы декомпилировать это, чтобы быть уверенным.

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

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