1. 禁止在一个类的静态构造函数中访问另一个类中的静态成员。
   猜下下面这段程序的输出结果:

类的静态构造函数的其他几个注意点using System;
类的静态构造函数的其他几个注意点
using System.Threading;
类的静态构造函数的其他几个注意点
类的静态构造函数的其他几个注意点
namespace TypeConstructorLock
}

   执行结果:

类的静态构造函数的其他几个注意点E:CSC>staticlock.exe
类的静态构造函数的其他几个注意点Begin Static1 .cctor on thread Thread A
类的静态构造函数的其他几个注意点Begin Static2 .cctor on thread Thread B
类的静态构造函数的其他几个注意点
//Static2 has a message from Static1: blank
类的静态构造函数的其他几个注意点
Exit Static2 .cctor on thread Thread B
类的静态构造函数的其他几个注意点
//Static1 has a message from Static2: Hello From Static2
类的静态构造函数的其他几个注意点
Exit Static1 .cctor on thread Thread A



    留意上面的“//static2 has a message from static1:black”,里面取得的字符串值是“blank”,而不是“Hello From Static1”,我们不能确定两个静态构造函数中的两条message赋值语句谁已经执行或没有执行! 这里要记住一条规则:禁止在一个类的静态构造函数中访问另一个类中的静态成员(Avoid touching the static members of another type from within a type constructor)。虽然我们很少情况下会写出上面这种代码,但一旦写出来了,这种错误将很难调试,我们要牢记这样准则。

 

2. 如果静态构造函数中有异常(用E描述)抛出,则CLR会对E进行包装,重新抛出一个System.TypeInitializationException异常,而把E作为该异常的InnerException。在进行程序设计时,我们一定要保证在类的静态构造函数不能有异常抛出!


3. C#中不支持子类继承父类的静态成员,但却可以通过子类类名来访问父类的静态成员!
   反射静态成员的示例:

类的静态构造函数的其他几个注意点using System;
类的静态构造函数的其他几个注意点
using System.Reflection;
类的静态构造函数的其他几个注意点
namespace Reflection
}

   执行结果:

类的静态构造函数的其他几个注意点E:CSC>refstatic.exe
类的静态构造函数的其他几个注意点Hello World 
1
类的静态构造函数的其他几个注意点Hello World 
1 

 

 

参考:http://msdn.microsoft.com/msdnmag/issues/05/01/StaticsinNET/default.aspx


相关文章:

  • 2021-10-01
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2022-03-09
猜你喜欢
  • 2021-08-27
  • 2021-12-18
  • 2021-11-20
  • 2022-02-27
  • 2022-12-23
  • 2021-06-16
  • 2022-12-23
相关资源
相似解决方案