![](/img/trans.png)
[英]VB.net ASP.net class Library Project Shared (Static) variable inside public class
[英]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.