ASP.Net的Normal类中的静态类

时间:2011-03-24 14:24:00

标签: c# asp.net class static

我知道在ASP.Net项目中创建一个静态类将导致该类的运行时属性可用于Web服务器上的所有会话。

我的问题是:如果我声明嵌套类是静态的,但容器不是,那么跨会话的类共享是否仍然适用?

示例:

 public class FooContainer 
    {

        public static class Bar
        {
        }

        public static class dog
        {
        }
    }

3 个答案:

答案 0 :(得分:4)

是;静态嵌套类与任何其他静态类具有相同的行为。嵌套类行为不同的唯一时间是外部类是泛型类型(嵌套类型然后通过父类隐式通用,因此FooContainer<X>.Bar将独立于FooContainer<Y>.Bar)。

请注意:静默在会话之间共享数据充满了危险。像偏执狂一样同步。就个人而言,我需要一个很好的理由来做到这一点......它需要仔细实施。我只对配置缓存之类的东西使用这种方法,即便如此,我也非常谨慎

答案 1 :(得分:2)

最终,是的。

嵌套静态类的编译方式与根级静态类相同(Marc明智地注意到涉及泛型的细微差别) - 唯一的区别是类型路径的限定,但这在任何情况下都是自然的环境,而不是副作用。

答案 2 :(得分:1)

当我看到有人在同一句话中说“静态数据”和“ASP.NET”时,各种警报都会消失。

是的,正如Marc所说,静态类即使是嵌套也是静态的,你只需要通过包含类来调用它们

MyStaticClass.StaticField = 3; ///wont work
MyInstanceClass.MyStaticClass.StaticField = 3; // works

任何可实例化的类都可以拥有静态方法/属性/构造函数,使得一个类显式静态只是具有额外的好处,你不能使我的错误成为非静态的东西,澄清类的目的和意图。

但要注意,ASP.net中的静态类在应用程序级别上是静态的,因此如果您有多个用户,他们都将看到相同的静态数据,无论授权如何,并且该数据的更改将影响所有用户谁使用它。
因此,静态变量可能是放置从db读取一次的东西的正确位置,然后只是显示,即应用程序的当前版本,或应用程序的开始时间,但是这是一个非常错误的放置位置用户特定数据,如语言首选项,用户名等等......