Причина в том, что FormsAuthentication - это класс, который предшествует статическому классу.Он был представлен в .Net 1.1, в которой не было понятия статических классов.Поскольку класс работает, и его изменение сейчас бесполезно, его, вероятно, никто не собирается пересматривать, чтобы удалить частный ctor и сделать его статическим, а не запечатанным.
Вероятно, статический, как может аутентифицироватьсчитаться одиноким.Вам не потребуется более одного экземпляра FormsAuthentication в вашем приложении (хотя технически со статическим классом никогда не бывает экземпляра, но с FormsAuth потенциально может быть один, вам придется декомпилировать, чтобы увидеть).Поскольку нет необходимости создавать более одного экземпляра, достаточно статических методов.Это делает код модульного тестирования, который опирается на него, более сложным, но в то время не уделялось так много внимания модульному тестированию.Вы не можете передавать экземпляры статических классов в методы, тогда как с помощью синглетонов вы можете.
Единственное узкое место - это вероятная блокировка за кулисами, поскольку .Net обычно обеспечивает безопасность потоков для статических членов.Реально, хотя это вряд ли вызовет проблемы;у него также может быть локальное хранилище потоков, поэтому он может вообще не блокироваться.Вы должны были бы декомпилировать это, чтобы быть уверенным.
Это зависит от того, есть ли статические данные, которые должны быть заблокированы для обеспечения безопасности потока.Если это так, блокировка может вызвать некоторую конкуренцию за общий ресурс, поскольку потоки будут ожидать разблокировки критической секции, и даже тогда будет разрешен только один поток, другие будут ждать своей очереди.Но у вас также могут быть статические методы, которые используют ТОЛЬКО информацию из параметров или потоковых локальных переменных хранения, и в этом случае не возникает проблем с синхронизацией, и эти методы можно вызывать независимо, без "горлышка бутылки".