静态& const成员,静态类和瓶颈

时间:2012-03-04 02:50:43

标签: c# static

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

一:为什么要声明一个包含所有static和const成员而不使该类静态的类?

我一直在研究反射器中的.net代码作为学习练习。我一直在研究的课程证明了这个设计是FormsAuthentication类。它的所有成员都标记为staticconst但它自己的类被标记为public sealed该类中唯一的非静态成员是没有实现的默认构造函数。为什么这个班级没有被标记为public static sealed

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

二:这不会导致瓶颈吗?如果是这样,为什么这样设计呢?

1 个答案:

答案 0 :(得分:4)

原因是FormsAuthentication是一个早于静态类功能的类。它是在.Net 1.1中引入的,它没有静态类的概念。由于班级正在运作,现在改变它没有任何好处,可能没有人会重新访问它以删除私人ctor并使其静止而不是密封。

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

唯一的瓶颈是幕后可能存在锁定,因为.Net通常为静态成员提供线程安全性。实际上虽然这不太可能导致问题;它也可能有线程本地存储,因此根本不会进行任何锁定。你必须反编译才能确定。

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