C# 基础系列--类二(静态类及扩展方法)

  继续上一篇的内容,其实这两篇没有什么关联。这次我们 要静态类的学习。我们先新建两个项目--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;
        }
    }

  很简单吧~~~我还是必须喜欢这个扩展方法的。直接用智能提示,代码量少了,你只要敲个.就可以 出 方法名字,前提是,你已经应用 了 你 写的扩展方法。

 

  坚持星期一到四,一天一篇。直到我写完基础篇,就当是自我复习。

 

 

posted @ 2012-07-18 00:41  望江南  阅读(3686)  评论(2编辑  收藏  举报