日期:2014-05-16  浏览次数:20932 次

下班前弱问下,关于类里静态字段的问题。



类里的静态字段是所有类的对象共享的,只有一个拷贝。

那是不是只要程序一跑起来,就给静态字段在内存里开了空间?

哪怕这个类从头到尾一个对象实例都没建立过?
------解决方案--------------------
第一次用到这个类的时候会初始化静态字段,调用静态构造方法。
如果整个运行期间一直没用到的话那就不会初始化
------解决方案--------------------
如果类中存在静态构造函数(第 10.11 节),则静态字段初始值设定项的执行在该静态构造函数即将执行前发生。否则,静态字段初始值设定项在第一次使用该类的静态字段之前先被执行,但实际执行时间依赖于具体的实现
http://msdn.microsoft.com/zh-cn/library/aa645758%28v=vs.71%29.aspx
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
------解决方案--------------------
没实例过这个类的对象,没有StaticClass.StaticVarible使用过,就没开辟过空间。

若实例化包含静态变量的类,则静态变量是在类构造函数之前先赋值的。。
------解决方案--------------------
大体上可以这么理解:当运行时调用到一个托管方法的时候,jit编译器会编译里面用到的所有类型。编译类型的时候会创建runtimetype对象,runtimetype对象对应于我们声明的每一个类,当然也包括.net framework中的类。例如我们使用typeof(MyClass)返回的Type对象,其实就是一个runtimetype对象,因为runtimetype的基类就是Type。该runtimetype对象存在于Appdomain的loader堆中,runtimetype对象的内存中应该包含了该类型中静态变量的引用(引用类型),或者直接包含静态值类型变量。
所以说,对于同一个类形,每个appdomain都会有静态变量的副本,相互不会影响。
对于开放泛型类型来说,情况有不一样,假如说List<T>类型内部有一个静态变量,那么List<int> ,List<string>等等这些关闭的类型中都会有List<T>中所声明的静态变量的副本。他们之间保持独立。所以在泛型类型定义中定义静态变量来使所有关闭的泛型类型共享同一个对象是错误的。
当在静态变量上应用了ThreadStatic特性而且又同时存在多一个Appdomain的时候,事情又更复杂了。
另外,对于mscorlib中定义的类型,在不同的appdomain中是共享的。这么做是为了提高性能。比如说typeof(int),在不同的appdomain中创建不同的int类型的runtimetype对象除了浪费内存没什么好处。所以typeof(int)返回的类型对象存在于共享appdoman中。
以上只是我的理解,不保证正确性。
------解决方案--------------------
当你第一次使用某个类型的对象,.net平台会首先初始化这个类型对象,然后才用这个类型对象来创建对象的实例。以后创建这类型对象,则直接使用类型对象创建对象的实例。

第一次初始化类型对象时(而不是将dll模块加载到内存时)才会初始化静态变量值。实际上,这个初始化动作是与你的 
static 类型名(){}
方法一同执行的。