【问题标题】:static & const members, static classes and bottlenecks静态和常量成员、静态类和瓶颈
【发布时间】:2012-03-22 01:19:24
【问题描述】:

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

一:为什么要声明一个具有所有静态和常量成员的类而不使该类静态?

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

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

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

【问题讨论】:

    标签: c# static


    【解决方案1】:

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

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

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

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

    【讨论】:

    • FormsAuthentication没有实例被实例化。它是一个纯粹的静态类,正如您所指出的,如果它没有早于语法,则应该在该类上使用 static 关键字。因此,在单例的意义上考虑这个类是完全不准确的,根据定义,单例意味着一个实例
    • @KirkWoll 番茄,番茄。从概念上讲,它是同一件事,它的静态方法与传统的单例方法只是一个实现细节。当然,单例模式可能有一些优点,但如果您不需要它们,静态也可以。
    • 这不是“实施细节”; definition 的“单例”需要一个 instance ——这就是它被称为单例的原因。即“单个”实例。
    • @KirkWoll 抱歉,您不同意。存在差异,我已经对此进行了扩展,但除非您关心它们,否则这只是概念上的差异。两者各有优劣,但实际上只是一个实现细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多