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;
        }
    }

  很簡單吧~~~我還是必須喜歡這個擴展方法的。直接用智能提示,代碼量少了,你只要敲個.就可以 出 方法名字,前提是,你已經應用 了 你 寫的擴展方法。

 

  堅持星期一到四,一天一篇。直到我寫完基礎篇,就當是自我復習。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM