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