本文主要介紹了c#類別的建構方法。具有一定的參考價值,下面跟著小編一起來看下吧
一、建構方法
類別的建構方法是類別的成員方法的一種,它的作用是對類別中的成員進行初始化操作。類別的建構方法分為:
1.靜態建構方法
# 2.實例建構方法
1.靜態建構方法
類別的靜態建構方法是類別的成員方法的一種,它的作用是對類別中的靜態成員進行初始化操作。下面請看程式碼實例:using System; namespace LycheeTest { class Test { //定义一个静态成员变量 private static int a; //定义静态构造函数 static Test() { //初始化静态成员变量 a = 11; } public void Show() { Console.WriteLine("静态字段 a 的值是:{0}", a); } } class Program { static void Main(string[] args) { Test t = new Test(); t.Show(); Console.ReadKey(); } } }首先,上面這段程式碼定義了兩個類別。第 3 行程式碼定義了類別 Test。定義類別的時候,類別的存取權限修飾符有兩個,一個是 public,另一個是 internal。當不寫任何存取修飾符的時候,類別的存取權限預設是 internal。 這個存取權限的意義是,這個類別只能被本程式集訪問,不能被本程式集以外的類別存取。如果這個類別是屬於
類別庫的,那麼它必須是 public 的,否則呼叫它的組件就不能存取它。第 5 行程式碼定義了一個靜態欄位成員,第 7 行程式碼就是靜態建構方法。可以看到,靜態建構方法的特點是,以 static 關鍵字來說明這個方法是靜態的,方法名稱要跟類別名稱完全相同,這裡要注意大小寫。 靜態建構方法不能含有參數,靜態建構方法不能有回傳值。在靜態建構方法體內可以做初始化靜態成員的操作。第 11 行程式碼定義了一個實例方法,它的作用是輸出靜態欄位的值。在第 16 行的類 Program 中的 Main(注意:在java中是main) 方法中呼叫了這個類,第 18行創建了這個類的一個實例,第 19 行 呼叫了類的實例方法。
從上面的程式碼可以看到,並沒有明確地呼叫類別的靜態建構方法。 下面請看以上程式碼的執行結果:靜態欄位a 的值是:11
using System; namespace LycheeTest{ class Test { private static int a; static Test() { a++; } public void Show() { Console.WriteLine("静态字段 a 的值是:{0}", a); 14 } } class Program { static void Main(string[] args) { Test t = new Test(); t.Show(); Test t1 = new Test(); t.Show(); Console.ReadKey(); } } }這段程式碼將靜態建構方法做了修改,在方法體內將靜態欄位 a 進行自增操作。然後在程式碼的第 17 行又 建立了一個類別的實例,然後再次呼叫類別的實例方法。 下面看執行結果:
静态字段 a 的值是:1 静态字段 a 的值是:1可以看到,靜態欄位的值並沒有增加。這就是靜態建構方法執行的特點,它只執行了一次。當程序集 運作的時候,將會建立一個應用程式域,在一個應用程式域中,類別的靜態建構方法只會執行一次。 下面再修改程式碼實例如下:
using System; namespace LycheeTest { class Test { public static int a; static Test() { Console.WriteLine("类的静态构造方法开始执行"); a++; } public void Show() { Console.WriteLine("静态字段 a 的值是:{0}", a); } } class Program { static void Main(string[] args) { Console.WriteLine("静态字段 a 的值是:{0}", Test.a); Console.WriteLine("静态字段 a 的值是:{0}", Test.a); Console.ReadKey(); } } }這段程式碼在類別的靜態建構方法中列印輸出了一行標記,類別的靜態欄位的存取權限也修改為public,這讓它可以在類別外被呼叫。在 Main 方法中兩次列印輸出了靜態欄位的值,注意在類別外呼叫類別的靜態欄位需要 使用類別名稱進行
引用。
下面是程式碼的執行結果:类的静态构造方法开始执行 静态字段 a 的值是:1 静态字段 a 的值是:1本段程式碼並沒有建立類別的實例。在引用類別的靜態成員之前,類別的靜態建構方法將會被呼叫。這個被呼叫的類別的靜態成員包括靜態字段和靜態方法。這就是類別的靜態建構方法呼叫的第二個條件。 下面再修改程式碼實例如下:
using System; namespace LycheeTest { class Program { private static int a; static Program() { Console.WriteLine("类的静态构造方法被调用"); a = 11; } static void Main(string[] args) { Console.WriteLine("Main 方法被调用"); Console.WriteLine("静态字段 a 的值是:{0}", a); Console.ReadKey(); } } }這段程式碼在包含 Main 方法的類別中定義了靜態欄位和靜態建構方法。因為 Main 方法也是一個靜態方法,類別的靜態建構方法被呼叫而且它是類別的入口點方法,那麼它和類別的靜態建構方法之間是誰先呼叫呢?下面先來看程式碼的執行結果:
类的静态构造方法被调用 Main 方法被调用 静态字段 a 的值是:11透過程式碼的執行結果可以看到,因為類別的入口點方法仍然是靜態方法,那麼在任何靜態成員被呼叫之前,靜態建構方法都首先被調用。所以,可以得到以下結論,類別的靜態建構方法先於類別的 Main 方法被呼叫。 那麼類別的靜態建構方法能否被明確地呼叫呢?下面看程式碼實例:
using System; namespace LycheeTest { class Program { private static int a; static Program() { Console.WriteLine("类的静态构造方法被调用"); a = 11; } static void Main(string[] args) { Program(); Console.ReadKey(); } } }
在这段代码中的第 10 行显式调用了类的静态构造方法,这时编译器会报错。
2.实例构造函数
类的实例构造方法是类的成员方法的一种,它的作用是对类的实例成员进行初始化操作。实例构造方法可以实现重载,在创建类的实例时,可以显式的指定不同的参数来调用重载的不同的实例构造方法。下面请看代码实例:
using System; namespace LycheeTest { class Program { private static int a; private int b = 12; private string c = "Hello World"; static Program() { Console.WriteLine("类的静态构造方法被调用"); a = 11; } public Program(int a, string s) { Console.WriteLine("带二个参数的构造方法被调用"); this.b = a; this.c = s; } public Program(int a) : this(a, "通过 this 关键字调用构造方法") { Console.WriteLine("带一个参数的构造方法被调用"); } public void Show() { Console.WriteLine("静态字段 a 的值是:{0}", a); Console.WriteLine("实例字段 b 的值是:{0}", b); Console.WriteLine("实例字段 c 的值是:{0}", c); } static void Main(string[] args) { Program p1 = new Program(33, "这是创建的实例 P1"); Program p2 = new Program(34); p1.Show(); p2.Show(); Console.ReadKey(); } }
这段代码的第 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 关键字调用构造方法"。最后,代码控制又返回 来执行带一个参数的实例构造方法体中的打印语句,"带一个参数的构造方法被调用"这个字符串被打印。 至此,实例构造方法的执行完毕。接下来的代码打印静态字段的值,可以看到两个实例打印出来的静态字段值是一样的,但是它们的实 例字段的值各不相同。
可选参数和命名参数也可以用于实例构造方法,下面看代码实例:
using System; namespace LycheeTest { class Program { private int b; private string c; public Program(int a = 12, string s = "") { this.b = a; this.c = s; } public void Show() { Console.WriteLine("实例字段 b 的值是:{0}", b); Console.WriteLine("实例字段 c 的值是:{0}", c); } static void Main(string[] args) { Program p1 = new Program(); //构造方法的两个参数都采用默认值 Program p2 = new Program(34); //构造方法的 string 类型参数采用默认值 Program p3 = new Program(23, "Hello World"); //构造方法的两个参数采用传入参数 Program p4 = new Program(s: "今天的天气真好"); //采用命名参数,另一个参数 a 采用默认值 p1.Show(); p2.Show(); p3.Show(); p4.Show(); Console.ReadKey(); } } }
代码的第 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 的值是:今天的天气真好
以上是詳解c#類別的建構方法及範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!