類中static、const、readonly、partial修飾符

static

修飾類成員:
static在C#中的用法與C++類似,當聲明一個類成員爲靜態時,意味着無論有多少個類的對象被創建,只會有一個靜態成員的副本,static變量可在成員函數或類的定義外部進行初始化,也可以在類內部定義初始化靜態變量,被static修飾的函數也稱靜態函數,靜態函數成員可以訪問其他靜態成員,但不能訪問實例成員,我們可以從類的外部訪問靜態成員,但在訪問時,C#和C++在訪問時有所不同C#中class.靜態成員,且C#中只能用類來訪問static成員,而不能用對象.靜態成員來訪問C++中:既可以使用class::靜態成員 來訪問,也可以通過對象.靜態成員來訪問,只是C++中在類內部定義完static成員後必須在類外進行初始化

    class Program
    {
        static int i = 100;
        static void Main(string[] args)
        {
            Console.WriteLine(Program.i); //100
        }
    }

修飾類(靜態類):

靜態類中所有成員都是靜態的,靜態類用於存放不受實例數據影響的數據和函數,靜態類的一個常見的用途可能就是創建一個包含一組數學方法和值的數學庫,關於靜態類的特點如下:
(1)類本身必須標記爲static  例如:static public class A
(2)類的所有成員必須是靜態的
(3)類可以有一個靜態構造函數,但不能有實例構造函數,不能創建該類的實例
(4)靜態類是隱式密封的,也就是說不能繼承靜態類

    static class A
    {
        static public int a = 100;
        static public void foo() { }  //成員必須是靜態的
        //public void foo() { } 不能有實例成員
    }
    //class B : A { }  不能繼承靜態類
    class Program
    {
        static void Main(string[] args)
        {
            //A a = new A(); 不能創建靜態類的實例
            Console.WriteLine(A.a);
        }
    }

const

const在C#中的使用與C++有所不同,const用於在類中定義成員常量,與本地常量類似,用於初始化成員常量的值在編譯時必須是可計算的,而且C#在聲明成員常量的時候就必須對其進行初始化,否則會出錯,C++中const修飾的數據成員則既可以在聲明時直接初始化,也可以在聲明後在構造函數的初始化列表中進行初始化定義,與C++不同,C#中沒有全局常量,每個常量都必須聲明在類內。

特點:常量的表現像靜態值,它們對類的每個實例都是"可見的",而且即使沒有類的實例也可以使用,所以也可以通過
class.成員常量來訪問,與真正的靜態量不同,常量沒有自己的存儲位置,而是在編譯時被編譯器替換,這種方式類似於C++中的#define值。雖然常量成員表現的像一個靜態量,但不能將常量聲明爲static,C++中static和const是可以一起使用的

    class Program
    {
        const int i = 10;
        //const int i; 錯誤,成員常量必須在定義的時候就初始化且不允許再次賦值
        //const static int=100; 不存在這種寫法
        static void Main(string[] args)
        {
            Console.WriteLine(Program.i); //10
        }
    }

readonly

字段可以用readonly修飾符來聲明,其作用類似於將字段聲明爲const,一但值被設定就不能改變,readonly字段只可以在構造函數中初始化,如果嘗試在其他方法(即使這個方法只被構造函數調用)中初始化一個readonly字段,會得到一個編譯錯誤

readonly與const的區別:
(1)const字段只能在字段的聲明語句中初始化,而readonly字段沒有這個限制
(2)const字段的值必須在編譯時決定,而readonly字段的值,可以在運行時決定,這種增加的自由性允許你在不同的環境或不同的構造函數中設置不同的值
(3)和const不同,const行爲總是靜態的,而對於readonly字段,它可以是實例字段也可以是靜態字段,它在內存中有存儲位置

    class Program
    {
        public readonly int a;
        public static readonly int b;
    
        static Program()
        {
            b = 200; //static修飾的可在靜態構造函數中初始化
        }

        Program()
        {
            a = 100; 
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine(p.a);  //100
            Console.WriteLine(Program.b);  //200
        }
    }

partial

partial爲分部類型,在C#中類的聲明可以分割成幾個分部類的聲明。類型修飾符partial不是關鍵字,所以在其他上下文中,可以在程序中把它用作標識符,但直接用在關鍵字class、struct或interface之前時,它表示分部類型。

partial聲明分部類:
(1)每個分部類的聲明都含有一些類成員的聲明
(2)類的分部類聲明可以在同一文件中也可以在不同文件中
(3)每個局部聲明必須被標爲partial class,而不是單獨的關鍵字class
(4)組成類的所有分部類聲明必須在一起編譯,使用分部聲明的類必須有相同的含義,就好像所有類成員都聲明在一個單獨的類聲明體內

分部方法時聲明在分部類中不同部分的方法,分部方法的不同部分可以聲明在不同的分部類中

partial聲明分部方法:
(1)定義聲明和實現聲明的簽名和返回類型必須匹配
(2)返回類型必須是void
(3)簽名不能包括訪問修飾符,這使分部方法時隱式私有的
(4)參數列表不能包含out參數
(5)在定義聲明和實現聲明中都必須包含上下文關鍵字partial,直接放在關鍵字void之前
(6)可以有定義部分而沒有實現部分,在這種情況下編譯器把方法的聲明以及方法內部任何對方法的調用都移除,不能只有分部方法的實現部分而沒有定義部分

    partial class A
    {
        partial void foo(int i);  //聲明
    }

    partial class A
    {
        partial void foo(int i)  //實現
        {
            Console.WriteLine(i);  //1000
        }
        public void fun(int i)
        {
            foo(i);   
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            //a.foo();  分部方法是private的權限,所以不能直接訪問
            a.fun(1000);  //如果想調用分部方法,只能再定義一個接口
        }
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章