继续上一篇的内容,其实这两篇没有什么关联。这次我们 要静态类的学习。我们先新建两个项目--AssemblyLibrary(类库)和ConsolTest(控制台)
静态类是一种很特殊的类,他有四个特点:
仅包含静态成员。 无法实例化。 不能被继承 不能包含实例构造函数。
AssemblyLibrary:
public static class StaticClass { //string a; 错误:仅包含静态成员 static string a; static StaticClass() { a = "1"; } //错误:没有实例构造函数 //public StaticClass() //{ //} } public class SS : BuTongClass //错误:不能被继承 StaticClass { public SS() : base(1) { } } public class BuTongClass { public readonly static int i = 0; static BuTongClass() { i = 1; } public bool Equle; public BuTongClass(int a) { if (a == i) Equle = true; } }
ConsolTest
static void Main(string[] args) { BuTongClass butong = new BuTongClass(1); //StaticClass sc = new StaticClass(); 错误:不能被实例化 Console.WriteLine(butong.Equle); Console.Read(); }
错误的地方我都注释掉了。也附上了错误点在那里。
运行的结果:True。
如果你想对静态的只读变量继续赋值
public readonly static int i = 0; 这样可以赋值,也可以再静态构造函数中赋值
静态构造函数里面的变量必须是静态成员而且只能执行一次。如果利用好这个特性,我们可以完成一些意想不到的效果,比如单例模式
传统的代码代码:
View Code
public class SingeClass { private static SingeClass _instance; private static object o = new object(); public static SingeClass GetInstance() { if (_instance == null) { lock (o) { if (_instance == null) _instance = new SingeClass(); } } return _instance; } }
我们可以利用静态构造函数的特点,实现单例:
public class SingeClass { private static SingeClass _instance; static SingeClass() { _instance = new SingeClass(); }
private SingeClass(){}
public static SingeClass GetInstance() { return _instance; } }
昨天晚上写的不够严谨,现在把默认构造函数设置为private,让外部不能实例化 。这里谢谢@看风景的人同学的提醒,
静态构造函数,相对而言,使用的不多,他的调用时.net做的如果有多个静态构造函数,那个先调用,我们不得而知。静态类,现在使用的最多的扩展方法。在framework3.5以上,
名称空间System.Linq就使用了大量的扩展方法
扩展方法,他必须是静态类。扩展的方法也必须是静态方法。
这是system.linq中的一个扩展方法的事例:我们可以看到的个是 static 类型扩展方法名(this 扩展的对象,xxxxx)
我们直接来个简单的例子
class Program { static void Main(string[] args) { string str = "1"; ; Console.WriteLine(str.ToInt()); Console.Read(); } } public static class StringEx { public static int ToInt(this string source) { int result; if (int.TryParse(source, out result)) return result; return 0; } }
很简单吧~~~我还是必须喜欢这个扩展方法的。直接用智能提示,代码量少了,你只要敲个.就可以 出 方法名字,前提是,你已经应用 了 你 写的扩展方法。
坚持星期一到四,一天一篇。直到我写完基础篇,就当是自我复习。