程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#中心根底--類的結構辦法

c#中心根底--類的結構辦法

編輯:C#入門知識

c#中心根底--類的結構辦法。本站提示廣大學習愛好者:(c#中心根底--類的結構辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是c#中心根底--類的結構辦法正文


一、結構辦法

  類的結構辦法是類的成員辦法的一種,它的作用是對類中的成員停止初始化操作。類的結構辦法分為:

    1.靜態結構辦法
    2.實例結構辦法

  1.靜態結構辦法

  類的靜態結構辦法是類的成員辦法的一種,它的作用是對類中的靜態成員停止初始化操作。上面請看代碼實例:

 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 的值是:明天的天氣真好

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved