C#中有一个修饰符,它叫static,国人把它叫静态化的,它可以去修饰类,方法,属性,事件等元素。
在100%的教科书中把static叫做静态的,对于原本就很抽象的编程语言来说,无疑使它更加抽象化了,啥是静态,静止不动?有点意思。
先看一个static的应用场合代码片断:
一 静态类:它在程序初始化时自动被执行
1 public static class ConnectionFactory 2 {...}
二 静态方法和静态属性:它在类被第一次使用或第一次被实例化时,被执行
1 public static string Conn=WebConfig.SQLConn; 2 public static DataContext Instance() 3 {...}
三 静态事件,它与静态属性和方法一样的执行机制
1 public static event StartEventHandler Start;
事实上,以上三点是书本上经常介绍的,但我不认为它是一种学习static的最好方式,看一下我对static的理解:
它是类本身的东西,与实例无关,即类的属性,类的方法,类的事件等等,它与实例无关,也就是实例A与实例B,对于public static修饰符下的属性,方法,事件是平等的,同时也是共享的。
如果在一个类型B中对StaticA类中的静态属性Num赋值,它会对所有类中使用Num属性的位置进行修改(事实上,在内在中,它只是一个地址),你的代码可能是这样:
1 /// <summary> 2 /// 测试类 3 /// </summary> 4 public class StaticA 5 { 6 /// <summary> 7 /// 静态属性 8 /// </summary> 9 public static string Num = "类的属性"; 10 }
在其它类中,有对Num属性的使用:
1 public class A 2 { 3 public string ANum = StaticA.Num; 4 } 5 public class B 6 { 7 public string BNum = StaticA.Num; 8 }
而当我们在程序的任何一处修改Num的值时,以上A和B中的实例属性ANum和BNum也就会发生变化了,呵呵。
看一下,由static实现的单件模式吧(类只能有一个实例)
1 public sealed class Singleton 2 { 3 // 静态,易变的对象 4 private static volatile Singleton instance = null; 5 // Lock对象,线程安全所用 6 private static object syncRoot = new Object(); 7 8 private Singleton() { } 9 10 public static Singleton Instance 11 { 12 get 13 { 14 if (instance == null) 15 { 16 lock (syncRoot) 17 { 18 if (instance == null) 19 instance = new Singleton(); 20 } 21 } 22 23 return instance; 24 } 25 } 26 }
总结一下static的技术要点:
1 static与具体实例无法,属性类本身的东西,而不加static是与当前实例(new ())有关的个性化对象
2 static叫它静态对象不如叫它全局对象或类自身对象
3 static有时可以提高系统性能,即,在为对象开辟一块内存空间