静态&;const成员、静态类和瓶颈
本文关键字:静态类 成员 amp const 静态 | 更新日期: 2023-09-27 18:26:49
我有两个关于static
+const
成员和static
类的问题。
一:为什么要声明一个具有所有static和const成员的类,而不使该类成为static?
我一直在学习反射镜中的.net代码作为一种学习练习。我一直在学习的展示这个设计的课程是FormsAuthentication
课程。它的所有成员都标记为static
或const
,而它自己的类则标记为public sealed
。类中唯一的非静态成员是没有实现的默认构造函数。为什么这个类没有被标记为public static sealed
?
我的第二个问题是关于为什么FormsAuthentication
类中的成员被声明为static
。据我所知,应用程序的AppDomain
中可能运行许多HttpApplications
,所有这些HttpApplications
都将共享相同的FormsAuthentication
类的静态成员。
第二:这不会造成瓶颈吗?如果是的话,为什么要这样设计?
原因是FormsAuthentication是一个早于静态类功能的类。它是在.Net 1.1中引入的,它没有静态类的概念。由于该类正在工作,现在更改它没有任何好处,因此很可能没有人会重新访问它来删除私有ctor并使其成为静态的而不是密封的。
它可能是静态的,因为auth可以被认为是单例的。您的应用程序中不需要多个FormsAuthentication实例(尽管从技术上讲,静态类从来没有实例,但使用FormsAuth可能会有一个实例,您必须进行反编译才能看到)。由于不需要创建多个实例,因此静态方法就足够了。它确实使依赖它的单元测试代码变得更加困难,但当时没有太多考虑单元测试。不能将静态类的实例传递给方法,而使用singleton则可以。
唯一的瓶颈是可能存在幕后锁定,因为.Net通常为静态成员提供线程安全性。现实地说,尽管这不太可能造成问题;它可能也有线程本地存储,所以它可能根本不进行任何锁定。你必须对它进行反编译才能确定。
这取决于是否有必须锁定的静态数据以确保线程安全。如果存在,锁定可能会导致共享资源的一些争用,因为线程将等待关键部分解锁,即使这样,也只允许一个线程进入,其他线程将等待轮到他们。但是,您也可以使用静态方法,这些方法只使用来自参数或线程本地存储变量的信息,在这种情况下,不涉及同步问题,并且这些方法可以独立调用,没有瓶颈。