繁体   English   中英

ASP.Net普通类内的静态类

[英]Static Class inside Normal class for ASP.Net

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

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

例:

 public class FooContainer 
    {

        public static class Bar
        {
        }

        public static class dog
        {
        }
    }

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

并且要小心:在会话之间共享数据的静态过程充满了危险。 像一个偏执的事情一样同步。 就我个人而言,我将需要一个很好的理由来执行此操作……并且它需要仔细执行。 我只将这种方法用于诸如配置缓存之类的事情,即使如此,我还是对此非常谨慎。

最终,是的。

嵌套的静态类的编译方式与根级别的静态类相同(Marc明智地指出了涉及泛型的细微差异)–唯一的差异是类型路径的限定,但这仅在任何环境中都是自然的,完全没有副作用。

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

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

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

任何可实例化的类都可以具有静态方法/属性/构造函数,使一个类显式静态化只是具有一个额外的好处,即您不能使非静态化成为我的错误,从而阐明了类的目的和意图。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM