c#中心根底--類的結構辦法。本站提示廣大學習愛好者:(c#中心根底--類的結構辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是c#中心根底--類的結構辦法正文
類的結構辦法是類的成員辦法的一種,它的作用是對類中的成員停止初始化操作。類的結構辦法分為:
1.靜態結構辦法
2.實例結構辦法
類的靜態結構辦法是類的成員辦法的一種,它的作用是對類中的靜態成員停止初始化操作。上面請看代碼實例:
1 using System; 2 namespace LycheeTest { 3 class Test { 4 //定義一個靜態成員變量 5 private static int a; 6 //定義靜態結構函數 7 static Test() { 8 //初始化靜態成員變量 9 a = 11; 10 } 11 public void Show() { 12 Console.WriteLine("靜態字段 a 的值是:{0}", a); 13 14 } 15 } 16 class Program { 17 static void Main(string[] args) { 18 Test t = new Test(); 19 t.Show(); 20 Console.ReadKey(); 21 } 22 } 23 }
首先,下面這段代碼定義了兩個類。第 3 行代碼定義了類 Test。定義類的時分,類的訪問權限修飾符有兩個,一個是 public,另一個是 internal。當不寫任何訪問修飾符的時分,類的訪問權限默許是 internal。 這個訪問權限的意義是,這個類只能被本順序集訪問,不能被本順序集以外的類訪問。假如這個類是屬於類庫的,那麼它必需是 public 的,否則調用它的順序集就不能訪問它。第 5 行代碼定義了一個靜態字段成員,第 7 行代碼就是靜態結構辦法。可以看到,靜態結構辦法的特點是,以 static 關鍵字闡明這個辦法是靜態的,辦法稱號要和類名完全相反,這裡要留意大小寫。靜態構造辦法不能含有參數,靜態結構辦法不能有前往值。在靜態結構辦法體內可以做初始化靜態成員的操作。第 11 行代碼定義了一個實例辦法,它的作用是輸入靜態字段的值。在第 16 行的類 Program 中的 Main(留意:在java中是main) 辦法中調用了這個類,第 18行創立了這個類的一個實例,第 19 行 調用了類的實例辦法。
從下面的代碼中可以看到,並沒有顯式調用類的靜態結構辦法。
上面請看以上代碼的執行後果:
靜態字段 a 的值是:11
可以看到,靜態結構辦法的確是被執行了。那麼上例就是靜態結構辦法的執行條件之一,在類的實例被創立時,類的靜態結構辦法將被自動調用。
靜態結構辦法的調用次第是在靜態字段的初始值設定項之後。
也就是第一步是靜態字段的默許值設置,第二步是執行靜態字段的初始值設定項,第三步就是調用類的靜態結構辦法。
上面將後面的代碼實例修正一下,代碼如下:
1 using System; 2 namespace LycheeTest{ 3 class Test { 4 private static int a; 5 static Test() { 6 a++; 7 } 8 public void Show() { 9 Console.WriteLine("靜態字段 a 的值是:{0}", a); 10 14 11 } 12 } 13 class Program { 14 static void Main(string[] args) { 15 Test t = new Test(); 16 t.Show(); 17 Test t1 = new Test(); 18 t.Show(); 19 Console.ReadKey(); 20 } 21 } 22 }
這段代碼將靜態結構辦法做了修正,在辦法體內將靜態字段 a 停止自增操作。然後在代碼的第 17 行又 創立了一個類的實例,然後再次調用類的實例辦法。
上面看執行後果:
靜態字段 a 的值是:1 靜態字段 a 的值是:1
可以看到,靜態字段的值並沒有添加。這就是靜態結構辦法執行的特點,它只執行了一次。當順序集 運轉的時分,將會創立一個使用順序域,在一個使用順序域中,類的靜態結構辦法僅僅執行一次。
上面再對代碼實例停止修正如下:
1 using System; 2 namespace LycheeTest { 3 class Test { 4 public static int a; 5 static Test() { 6 Console.WriteLine("類的靜態結構辦法開端執行"); 7 a++; 8 } 9 public void Show() { 10 Console.WriteLine("靜態字段 a 的值是:{0}", a); 11 } 12 } 13 class Program { 14 static void Main(string[] args) { 15 Console.WriteLine("靜態字段 a 的值是:{0}", Test.a); 16 Console.WriteLine("靜態字段 a 的值是:{0}", Test.a); 17 Console.ReadKey(); 18 } 19 } 20 }
這段代碼在類的靜態結構辦法中打印輸入了一行標志,類的靜態字段的訪問權限也修正為 public,這讓它可以在類外被調用。在 Main 辦法中兩次打印輸入了靜態字段的值,留意在類外調用類的靜態字段需求 運用類名停止援用。
上面是代碼的執行後果:
類的靜態結構辦法開端執行 靜態字段 a 的值是:1 靜態字段 a 的值是:1
本段代碼並沒有創立類的實例。在援用類的靜態成員之前,類的靜態結構辦法將被調用。這個被調用的類的靜態成員包括靜態字段和靜態辦法。這就是類的靜態結構辦法調用的第二個條件。
上面再對代碼實例停止修正如下:
1 using System; 2 namespace LycheeTest { 3 class Program { 4 private static int a; 5 static Program() { 6 Console.WriteLine("類的靜態結構辦法被調用"); 7 a = 11; 8 } 9 static void Main(string[] args) { 10 Console.WriteLine("Main 辦法被調用"); 11 Console.WriteLine("靜態字段 a 的值是:{0}", a); 12 Console.ReadKey(); 13 } 14 } 15 }
這段代碼在包括 Main 辦法的類中定義了靜態字段和靜態結構辦法。由於 Main 辦法也是一個靜態辦法,類的靜態結構辦法被調用而且它是類的入口點辦法,那麼它和類的靜態結構辦法之間是誰先調用呢?上面首先來看代碼的執行後果:
類的靜態結構辦法被調用 Main 辦法被調用 靜態字段 a 的值是:11
經過代碼的執行後果可以看到,由於類的入口點辦法依然是一個靜態辦法,那麼在任何靜態成員被調用之 前,靜態結構辦法都首先被調用。所以,可以得出如下結論,類的靜態結構辦法先於類的 Main 辦法被調用。
那麼類的靜態結構辦法能否被顯式調用呢?上面看代碼實例:
1 using System; 2 namespace LycheeTest { 3 class Program { 4 private static int a; 5 static Program() { 6 Console.WriteLine("類的靜態結構辦法被調用"); 7 a = 11; 8 } 9 static void Main(string[] args) { 10 Program(); 11 Console.ReadKey(); 12 } 13 } 14 }
在這段代碼中的第 10 行顯式調用了類的靜態結構辦法,這時編譯器會報錯。
2.實例結構函數類的實例結構辦法是類的成員辦法的一種,它的作用是對類的實例成員停止初始化操作。實例結構方法可以完成重載,在創立類的實例時,可以顯式的指定不同的參數來調用重載的不同的實例結構辦法。上面請看代碼實例:
1 using System; 2 namespace LycheeTest { 3 class Program { 4 private static int a; 5 private int b = 12; 6 private string c = "Hello World"; 7 8 static Program() { 9 Console.WriteLine("類的靜態結構辦法被調用"); 10 a = 11; 11 } 12 public Program(int a, string s) { 13 Console.WriteLine("帶二個參數的結構辦法被調用"); 14 this.b = a; 15 this.c = s; 16 } 17 public Program(int a) : this(a, "經過 this 關鍵字調用結構辦法") { 18 Console.WriteLine("帶一個參數的結構辦法被調用"); 19 } 20 public void Show() { 21 Console.WriteLine("靜態字段 a 的值是:{0}", a); 22 Console.WriteLine("實例字段 b 的值是:{0}", b); 23 Console.WriteLine("實例字段 c 的值是:{0}", c); 24 } 25 static void Main(string[] args) { 26 Program p1 = new Program(33, "這是創立的實例 P1"); 27 Program p2 = new Program(34); 28 p1.Show(); 29 p2.Show(); 30 Console.ReadKey(); 31 } 32 }
這段代碼的第 4 行、第 5 行和第 6 行辨別定義了三個字段成員,第 4 行是靜態字段,第 5 行和第 6 行代碼都有初始值設定項。代碼的第 8 行就是一個實例結構辦法的定義,實例結構辦法也是以類名作為辦法名,它沒有前往值, 在辦法名後面是訪問權限修飾符,可以運用的訪問權限修飾符包括 public、private 和 protected。其中的 protected 意味著結構辦法只能在此類外部訪問。實例結構辦法可以帶參數。 第 12 行代碼的實例結構辦法運用兩個傳入的參數對實例字段停止了賦值。第 17 行代碼定義了帶一個參數的實例結構辦法,它和前一個實例結構辦法構成了重載。實例結構辦法可以經過 this 關鍵字調用其他的實例結構辦法,辦法就是在參數列表的前面運用冒號然後接 this 關鍵字, 然後再跟參數列表,這個參數列表要婚配另一個重載的實例結構辦法。第 17 行的結構辦法只要一個參數, 它將這個參數經過 this 關鍵字傳遞給了另一個結構辦法,在用 this 調用另一個結構辦法的時分,為其同時傳入了一個字符串參數。第 24 行的實例辦法打印類的字段成員的值。在 Main 辦法中,第 26 行代碼和第 27 行代碼辨別定義了兩個實例,它們運用 new 關鍵字調用了不同的實例結構辦法。第 28 行和第 29 行辨別調用實例辦法打印類的靜態字段和實例的兩個字段成員的值。
上面先來看代碼的執行後果:
類的靜態結構辦法被調用 帶二個參數的結構辦法被調用 帶二個參數的結構辦法被調用 帶一個參數的結構辦法被調用
靜態字段 a 的值是:11
實例字段 b 的值是:33 實例字段 c 的值是:這是創立的實例 P1 靜態字段 a 的值是:11 實例字段 b 的值是:34 實例字段 c 的值是:經過 this 關鍵字調用結構辦法
如今用執行後果來引見實例結構辦法的執行進程,當第 26 行代碼創立類的實例時,類的靜態字段首先被設置成默許值,由於沒有字段的初始值設定項,所以接著就執行類的靜態結構辦法。這時靜態字段 a 被 設置成 11。由於第 26 行代碼運用 new 調用了帶有兩個參數的實例結構辦法,所以首先實例字段 b 被設置為 0,實例字段 c 被設置為 null。然後執行字段的初始值設定項,b 被賦值為 12,c 被賦值為“Hello World”。接 上去執行實例結構辦法體中的第一個語句,“帶二個參數的結構辦法被調用”這個字符串被打印。接上去 實例 p1 的字段 b 被設置為傳入的參數 33,留意結構辦法的形參 a 在這裡掩蓋了類的靜態字段 a。也就是說, 這時起作用的是實例結構辦法的部分變量 a。然後實例字段 c 被設置為字符串"這是創立的實例 P1"。第 27 行代碼運用 new 關鍵字調用了帶一個參數的實例結構辦法,在調用時,首先屬於 p2 的實例字段 b 被設置為 0,實例字段 c 被設置為 null。然後執行字段的初始值設定項,b 被賦值為 12,c 被賦值為“Hello World”。接上去執行的是 this 援用的帶兩個參數的實例結構辦法,"帶二個參數的結構辦法被調用"這個 字符串被打印。然後 b 被設置為 34,c 被設置為"經過 this 關鍵字調用結構辦法"。最後,代碼控制又前往 來執行帶一個參數的實例結構辦法體中的打印語句,"帶一個參數的結構辦法被調用"這個字符串被打印。 至此,實例結構辦法的執行終了。接上去的代碼打印靜態字段的值,可以看到兩個實例打印出來的靜態字段值是一樣的,但是它們的實 例字段的值各不相反。
可選參數和命名參數也可以用於實例結構辦法,上面看代碼實例:
1 using System; 2 namespace LycheeTest { 3 class Program { 4 private int b; 5 private string c; 6 public Program(int a = 12, string s = "") { 7 this.b = a; 8 this.c = s; 9 } 10 public void Show() { 11 Console.WriteLine("實例字段 b 的值是:{0}", b); 12 Console.WriteLine("實例字段 c 的值是:{0}", c); 13 } 14 static void Main(string[] args) { 15 Program p1 = new Program(); //結構辦法的兩個參數都采用默許值 16 Program p2 = new Program(34); //結構辦法的 string 類型參數采用默許值 17 Program p3 = new Program(23, "Hello World"); //結構辦法的兩個參數采用傳入參數 18 Program p4 = new Program(s: "明天的天氣真好"); //采用命名參數,另一個參數 a 采用默許值 19 p1.Show(); 20 p2.Show(); 21 p3.Show(); 22 p4.Show(); 23 Console.ReadKey(); 24 } 25 } 26 }
代碼的第 6 行定義了一個帶有可選參數和命名參數的結構辦法,然後第 15 創立了一個類的實例,在結構辦法中沒有傳入任何參數,這時,結構辦法的兩個參數都采用默許值。第 16 行代碼為結構辦法傳入了一個 int 類型的參數,這時,另一個 string 類型的參數采用默許值。 第 17 行代碼傳入了兩個參數,結構辦法的兩個參數都運用了這兩個傳入的參數。第 18 行代碼運用了命名參數指定傳入的參數是 string 類型的參數,並將它傳遞給形參 s。這時另一 個 int 類型的參數采用默許值。第 19 行到第 23 行代碼打印類的實例字段的值。這段代碼的執行後果如下:
實例字段 b 的值是:12 實例字段 c 的值是: 實例字段 b 的值是:34 實例字段 c 的值是: 實例字段 b 的值是:23 實例字段 c 的值是:Hello World 實例字段 b 的值是:12 實例字段 c 的值是:明天的天氣真好