静态&;const成员、静态类和瓶颈

本文关键字:静态类 成员 amp const 静态 | 更新日期: 2023-09-27 18:26:49

我有两个关于static+const成员和static类的问题。

一:为什么要声明一个具有所有static和const成员的类,而不使该类成为static?

我一直在学习反射镜中的.net代码作为一种学习练习。我一直在学习的展示这个设计的课程是FormsAuthentication课程。它的所有成员都标记为staticconst,而它自己的类则标记为public sealed。类中唯一的非静态成员是没有实现的默认构造函数。为什么这个类没有被标记为public static sealed

我的第二个问题是关于为什么FormsAuthentication类中的成员被声明为static。据我所知,应用程序的AppDomain中可能运行许多HttpApplications,所有这些HttpApplications都将共享相同的FormsAuthentication类的静态成员。

第二:这不会造成瓶颈吗?如果是的话,为什么要这样设计?

静态&;const成员、静态类和瓶颈

原因是FormsAuthentication是一个早于静态类功能的类。它是在.Net 1.1中引入的,它没有静态类的概念。由于该类正在工作,现在更改它没有任何好处,因此很可能没有人会重新访问它来删除私有ctor并使其成为静态的而不是密封的。

它可能是静态的,因为auth可以被认为是单例的。您的应用程序中不需要多个FormsAuthentication实例(尽管从技术上讲,静态类从来没有实例,但使用FormsAuth可能会有一个实例,您必须进行反编译才能看到)。由于不需要创建多个实例,因此静态方法就足够了。它确实使依赖它的单元测试代码变得更加困难,但当时没有太多考虑单元测试。不能将静态类的实例传递给方法,而使用singleton则可以。

唯一的瓶颈是可能存在幕后锁定,因为.Net通常为静态成员提供线程安全性。现实地说,尽管这不太可能造成问题;它可能也有线程本地存储,所以它可能根本不进行任何锁定。你必须对它进行反编译才能确定。

这取决于是否有必须锁定的静态数据以确保线程安全。如果存在,锁定可能会导致共享资源的一些争用,因为线程将等待关键部分解锁,即使这样,也只允许一个线程进入,其他线程将等待轮到他们。但是,您也可以使用静态方法,这些方法只使用来自参数或线程本地存储变量的信息,在这种情况下,不涉及同步问题,并且这些方法可以独立调用,没有瓶颈。