且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

类的静态构造函数的其他几个注意点

更新时间:2022-08-14 20:26:43

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

类的静态构造函数的其他几个注意点using System;
类的静态构造函数的其他几个注意点
using System.Threading;
类的静态构造函数的其他几个注意点
类的静态构造函数的其他几个注意点
namespace TypeConstructorLock
类的静态构造函数的其他几个注意点
{
类的静态构造函数的其他几个注意点    
class Class1
类的静态构造函数的其他几个注意点    
{
类的静态构造函数的其他几个注意点        [STAThread]
类的静态构造函数的其他几个注意点        
public static void Main(string[] args)
类的静态构造函数的其他几个注意点        
{
类的静态构造函数的其他几个注意点            Thread threadA 
= new Thread(new ThreadStart(TouchStatic1));
类的静态构造函数的其他几个注意点            threadA.Name 
= "Thread A";
类的静态构造函数的其他几个注意点      
类的静态构造函数的其他几个注意点            Thread threadB 
= new Thread(new ThreadStart(TouchStatic2));
类的静态构造函数的其他几个注意点            threadB.Name 
= "Thread B";
类的静态构造函数的其他几个注意点 
类的静态构造函数的其他几个注意点            threadA.Start();
类的静态构造函数的其他几个注意点            threadB.Start();
类的静态构造函数的其他几个注意点            threadA.Join();
类的静态构造函数的其他几个注意点            threadB.Join();
类的静态构造函数的其他几个注意点        }

类的静态构造函数的其他几个注意点 
类的静态构造函数的其他几个注意点        
static void TouchStatic1() string s = Static1.Message; }
类的静态构造函数的其他几个注意点        
static void TouchStatic2() string s = Static2.Message; }
类的静态构造函数的其他几个注意点    }

类的静态构造函数的其他几个注意点
类的静态构造函数的其他几个注意点    
class Static1
类的静态构造函数的其他几个注意点    
{
类的静态构造函数的其他几个注意点        
static Static1()
类的静态构造函数的其他几个注意点        
{
类的静态构造函数的其他几个注意点            Console.WriteLine(
"Begin Static1 .cctor on thread {0}"
类的静态构造函数的其他几个注意点                Thread.CurrentThread.Name);
类的静态构造函数的其他几个注意点            Thread.Sleep(
5000);
类的静态构造函数的其他几个注意点            Console.WriteLine(
"//Static1 has a message from Static2: {0}"
类的静态构造函数的其他几个注意点                Static2.Message);      
类的静态构造函数的其他几个注意点            message 
= "Hello From Static1";
类的静态构造函数的其他几个注意点            Console.WriteLine(
"Exit Static1 .cctor on thread {0}"
类的静态构造函数的其他几个注意点                Thread.CurrentThread.Name);
类的静态构造函数的其他几个注意点        }

类的静态构造函数的其他几个注意点 
类的静态构造函数的其他几个注意点        
static public string Message get return message; } }
类的静态构造函数的其他几个注意点        
static string message = "blank";
类的静态构造函数的其他几个注意点    }

类的静态构造函数的其他几个注意点 
类的静态构造函数的其他几个注意点    
class Static2
类的静态构造函数的其他几个注意点    
{
类的静态构造函数的其他几个注意点        
static Static2()
类的静态构造函数的其他几个注意点        
{
类的静态构造函数的其他几个注意点            Console.WriteLine(
"Begin Static2 .cctor on thread {0}"
类的静态构造函数的其他几个注意点                Thread.CurrentThread.Name);
类的静态构造函数的其他几个注意点            Thread.Sleep(
5000);
类的静态构造函数的其他几个注意点            Console.WriteLine(
"//Static2 has a message from Static1: {0}"
类的静态构造函数的其他几个注意点                Static1.Message);         
类的静态构造函数的其他几个注意点            message 
= "Hello From Static2";
类的静态构造函数的其他几个注意点            Console.WriteLine(
"Exit Static2 .cctor on thread {0}"
类的静态构造函数的其他几个注意点                Thread.CurrentThread.Name);
类的静态构造函数的其他几个注意点        }

类的静态构造函数的其他几个注意点 
类的静态构造函数的其他几个注意点        
static public string Message get return message; } }
类的静态构造函数的其他几个注意点        
static string message = "blank";    
类的静态构造函数的其他几个注意点    }

类的静态构造函数的其他几个注意点}

   执行结果:

类的静态构造函数的其他几个注意点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
类的静态构造函数的其他几个注意点
{
类的静态构造函数的其他几个注意点    
class Class1
类的静态构造函数的其他几个注意点    
{
类的静态构造函数的其他几个注意点        [STAThread]
类的静态构造函数的其他几个注意点        
static void Main(string[] args)
类的静态构造函数的其他几个注意点        
{           
类的静态构造函数的其他几个注意点            Type type;              
类的静态构造函数的其他几个注意点            
object result;
类的静态构造函数的其他几个注意点            PropertyInfo[] properties;
类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点            
object instance = null;
类的静态构造函数的其他几个注意点            
object[] index = null;
类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点            type 
= typeof(Static1);
类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点            properties 
= type.GetProperties(BindingFlags.Static | BindingFlags.Public);            
类的静态构造函数的其他几个注意点            result 
= properties[0].GetValue(instance, index);//注意:访问内的静态成员,这里传入的是null
类的静态构造函数的其他几个注意点
            Console.WriteLine(result.ToString());
类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点            type 
= typeof(Static2);
类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点            properties 
= type.GetProperties(BindingFlags.Static | BindingFlags.Public |
类的静态构造函数的其他几个注意点                 BindingFlags.FlattenHierarchy);
//如果不运用FlattenHierarchy,则返回空数组。
类的静态构造函数的其他几个注意点
        /*FlattenHierarchy:指定应返回层次结构上的公共静态成员和受保护的静态成员。
类的静态构造函数的其他几个注意点         * 不返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性。不返回嵌套类型。
类的静态构造函数的其他几个注意点         *
类的静态构造函数的其他几个注意点         * FlattenHierarchy告诉CLR将基类Static1的静态属性也算在内!
类的静态构造函数的其他几个注意点         * C#中不支持子类继承父类的静态成员,但却可以通过子类类名来访问父类的静态成员!
类的静态构造函数的其他几个注意点         * e.g.:我们可以通过访问Static2.Message来访问Static1.Message
类的静态构造函数的其他几个注意点         *  
*/

类的静态构造函数的其他几个注意点            result 
= properties[0].GetValue(instance, index);
类的静态构造函数的其他几个注意点            Console.WriteLine(result.ToString());
类的静态构造函数的其他几个注意点
类的静态构造函数的其他几个注意点        Console.WriteLine(Static2.Message);
类的静态构造函数的其他几个注意点        }

类的静态构造函数的其他几个注意点    }

类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点    
class Static1
类的静态构造函数的其他几个注意点    
{
类的静态构造函数的其他几个注意点        
static public string Message get return message; } }
类的静态构造函数的其他几个注意点        
static string message = "Hello World 1";
类的静态构造函数的其他几个注意点    }

类的静态构造函数的其他几个注意点            
类的静态构造函数的其他几个注意点    
class Static2 : Static1{}
类的静态构造函数的其他几个注意点}

   执行结果:

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

 

 

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


本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/04/05/710935.html,如需转载请自行联系原作者