我知道在ASP.Net项目中创建一个静态类将导致该类的运行时属性可用于Web服务器上的所有会话。
我的问题是:如果我声明嵌套类是静态的,但容器不是,那么跨会话的类共享是否仍然适用?
示例:
public class FooContainer
{
public static class Bar
{
}
public static class dog
{
}
}
答案 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读取一次的东西的正确位置,然后只是显示,即应用程序的当前版本,或应用程序的开始时间,但是这是一个非常错误的放置位置用户特定数据,如语言首选项,用户名等等......