亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解C#編程中構造函數的使用

2020-01-24 01:18:15
字體:
來源:轉載
供稿:網友

當類或結構創建時,其構造函數調用。構造函數與選件類或結構相同,并且,它們通常用于初始化新對象的數據成員。
在下面的示例中,使用一個簡單的構造函數定義了名為 Taxi 的類。然后使用 new 運算符來實例化該類。在為新對象分配內存之后,new 運算符立即調用 Taxi 構造函數。

public class Taxi{  public bool isInitialized;  public Taxi()  {    isInitialized = true;  }}class TestTaxi{  static void Main()  {    Taxi t = new Taxi();    Console.WriteLine(t.isInitialized);  }}

不帶參數的構造函數稱為“默認構造函數”。無論何時,只要使用 new 運算符實例化對象,并且不為 new 提供任何參數,就會調用默認構造函數。
除非類是 static 的,否則 C# 編譯器將為無構造函數的類提供一個公共的默認構造函數,以便該類可以實例化。
通過將構造函數設置為私有構造函數,可以阻止類被實例化,如下所示:

class NLog{  // Private Constructor:  private NLog() { }  public static double e = Math.E; //2.71828...}

結構類型的構造函數與類的構造函數類似,但是 structs 不能包含顯式默認構造函數,因為編譯器將自動提供一個構造函數。此構造函數會將 struct 中的每個字段初始化為默認值。然而,只有當 struct 用 new 實例化時,才會調用此默認構造函數。例如,下面的代碼使用 Int32 的默認構造函數,因此您可以確信整數已初始化:

int i = new int();Console.WriteLine(i);

不過,下面的代碼卻會導致編譯器錯誤,因為它沒有使用 new,而且嘗試使用尚未初始化的對象:

int i;Console.WriteLine(i);

或者,基于 structs 的對象(包括所有內置數值類型)可以初始化或賦值后使用,如下面的示例所示:

int a = 44; // Initialize the value type...int b;b = 33;   // Or assign it before using it.Console.WriteLine("{0}, {1}", a, b);

因此對值類型調用默認構造函數不是必需的。
類和 structs 都可以定義具有參數的構造函數。帶參數的構造函數必須通過 new 語句或 base 語句來調用。類和 structs 還可以定義多個構造函數,并且二者均不需要定義默認構造函數。例如:

public class Employee{  public int salary;  public Employee(int annualSalary)  {    salary = annualSalary;  }  public Employee(int weeklySalary, int numberOfWeeks)  {    salary = weeklySalary * numberOfWeeks;  }}

可以使用下列語句中的任一個語句來創建此類:

Employee e1 = new Employee(30000);Employee e2 = new Employee(500, 52);

構造函數可以使用 base 關鍵字來調用基類的構造函數。例如:

public class Manager : Employee{  public Manager(int annualSalary)    : base(annualSalary)  {    //Add further instructions here.  }}

在此示例中,基類的構造函數在執行構造函數塊之前被調用。 base 關鍵字可帶參數使用,也可不帶參數使用。構造函數的任何參數都可用作 base 的參數,或用作表達式的一部分。有關更多信息,請參見base(C# 參考)。
在派生類中,如果不使用 base 關鍵字來顯式調用基類構造函數,則將隱式調用默認構造函數(如果有的話)。這意味著下面的構造函數聲明在效果上是相同的:

 public Manager(int initialdata){  //Add further instructions here.} public Manager(int initialdata)  : base(){  //Add further instructions here.}


 

如果基類沒有提供默認構造函數,派生類必須使用 base 顯式調用基構造函數。
構造函數可以使用 this 關鍵字調用同一對象中的另一構造函數。和 base 一樣,this 可帶參數使用也可不帶參數使用,構造函數中的任何參數都可用作 this 的參數,或者用作表達式的一部分。例如,可以使用 this 重寫前一示例中的第二個構造函數:

public Employee(int weeklySalary, int numberOfWeeks)  : this(weeklySalary * numberOfWeeks){}

上一示例中對 this 關鍵字的使用導致此構造函數被調用:

public Employee(int annualSalary){  salary = annualSalary;}

構造函數可以標記為 public、private、protected、internal 或 protectedinternal。這些訪問修飾符定義類的用戶構造該類的方式。有關更多信息,請參見訪問修飾符。


實例構造函數
使用 new 表達式創建某個類的對象時,會使用實例構造函數創建和初始化所有實例成員變量。要初始化靜態類或非靜態類中的靜態變量,必須定義靜態構造函數。
下面的示例演示實例構造函數:

class CoOrds{  public int x, y;  // constructor  public CoOrds()  {    x = 0;    y = 0;  }}

注意
為了清楚起見,此類包含公共字段。建議在編程時不要使用公共字段,因為這種做法會使程序中任何位置的任何方法都可以不受限制、不經驗證地訪問對象的內部組件。數據成員通常應當為私有的,并且只應當通過類方法和屬性來訪問。
只要創建基于 CoOrds 類的對象,就會調用此實例構造函數。諸如此類不帶參數的構造函數稱為“默認構造函數”。然而,提供其他構造函數通常十分有用。例如,可以向 CoOrds 類添加構造函數,以便可以為數據成員指定初始值:

// A constructor with two arguments:public CoOrds(int x, int y){  this.x = x;  this.y = y;}

這樣便可以用默認或特定的初始值創建 CoOrd 對象,如下所示:

CoOrds p1 = new CoOrds();CoOrds p2 = new CoOrds(5, 3);

如果某個類沒有構造函數,則會自動生成一個默認構造函數,并使用默認值來初始化對象字段。例如,int 初始化為 0。有關默認值的更多信息,請參見 默認值表(C# 參考)。因此,由于 CoOrds 類的默認構造函數將所有數據成員都初始化為零,因此可以將它完全移除,而不會更改類的工作方式。本主題的稍后部分的示例 1 中提供了使用多個構造函數的完整示例,示例 2 中提供了自動生成的構造函數的示例。
也可以用實例構造函數來調用基類的實例構造函數。類構造函數可通過初始值設定項來調用基類的構造函數,如下所示:

class Circle : Shape{  public Circle(double radius)    : base(radius, 0)  {  }}

在此示例中,Circle 類將表示半徑和高度的值傳遞給 Shape(Circle 從它派生而來)提供的構造函數。使用 Shape 和 Circle 的完整示例請見本主題中的示例 3。
示例 1
下面的示例說明包含兩個類構造函數的類:一個類構造函數沒有參數,另一個類構造函數帶有兩個參數。

class CoOrds{  public int x, y;  // Default constructor:  public CoOrds()  {    x = 0;    y = 0;  }  // A constructor with two arguments:  public CoOrds(int x, int y)  {    this.x = x;    this.y = y;  }  // Override the ToString method:  public override string ToString()  {    return (String.Format("({0},{1})", x, y));  }}class MainClass{  static void Main()  {    CoOrds p1 = new CoOrds();    CoOrds p2 = new CoOrds(5, 3);    // Display the results using the overriden ToString method:    Console.WriteLine("CoOrds #1 at {0}", p1);    Console.WriteLine("CoOrds #2 at {0}", p2);    Console.ReadKey();  }}

輸出:

 CoOrds #1 at (0,0) CoOrds #2 at (5,3)    

示例 2
在此示例中,類 Person 沒有任何構造函數;在這種情況下,將自動提供默認構造函數,同時將字段初始化為它們的默認值。

public class Person{  public int age;  public string name;}class TestPerson{  static void Main()  {    Person person = new Person();    Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);    // Keep the console window open in debug mode.    Console.WriteLine("Press any key to exit.");    Console.ReadKey();  }}

輸出:

 Name: , Age: 0

注意,age 的默認值為 0,name 的默認值為 null。有關默認值的更多信息,請參見 默認值表(C# 參考)。
示例 3
下面的示例說明使用基類初始值設定項。 Circle 類是從通用類 Shape 派生的,Cylinder 類是從 Circle 類派生的。每個派生類的構造函數都使用其基類的初始值設定項。

abstract class Shape{  public const double pi = Math.PI;  protected double x, y;  public Shape(double x, double y)  {    this.x = x;    this.y = y;  }  public abstract double Area();}class Circle : Shape{  public Circle(double radius)    : base(radius, 0)  {  }  public override double Area()  {    return pi * x * x;  }}class Cylinder : Circle{  public Cylinder(double radius, double height)    : base(radius)  {    y = height;  }  public override double Area()  {    return (2 * base.Area()) + (2 * pi * x * y);  }}class TestShapes{  static void Main()  {    double radius = 2.5;    double height = 3.0;    Circle ring = new Circle(radius);    Cylinder tube = new Cylinder(radius, height);    Console.WriteLine("Area of the circle = {0:F2}", ring.Area());    Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());    // Keep the console window open in debug mode.    Console.WriteLine("Press any key to exit.");    Console.ReadKey();  }}

輸出:

  Area of the circle = 19.63  Area of the cylinder = 86.39
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠躁天天躁日日躁欧美| 亚洲欧美综合v| 国产精品视频导航| 国产精品福利观看| 欧美电影在线观看高清| 原创国产精品91| 日韩精品免费在线视频观看| xvideos成人免费中文版| 日韩最新中文字幕电影免费看| 精品日本美女福利在线观看| 91精品国产91久久久久久吃药| 亚洲精品福利在线| 国产精品黄色av| 久久亚洲综合国产精品99麻豆精品福利| 久久91亚洲精品中文字幕| 欧洲中文字幕国产精品| 国产午夜精品麻豆| 欧美一区三区三区高中清蜜桃| 久久久亚洲天堂| 国产免费一区二区三区在线能观看| 日韩高清有码在线| 日韩av在线直播| 国产精品白嫩美女在线观看| 久久成人精品电影| 亚洲桃花岛网站| 97人人爽人人喊人人模波多| 欧美日韩亚洲国产一区| www.欧美精品一二三区| 九九精品在线视频| 欧美日本黄视频| 欧美日韩国产999| 日韩视频在线免费观看| 全亚洲最色的网站在线观看| 色噜噜狠狠狠综合曰曰曰| 国产乱肥老妇国产一区二| 亚洲乱码国产乱码精品精| 亚洲国产精品福利| 欧美激情视频网址| 色偷偷88888欧美精品久久久| 亚洲欧美在线播放| 精品国产欧美成人夜夜嗨| 欧美xxxx18性欧美| 日韩欧美国产高清91| 国外成人在线播放| 亚洲成av人乱码色午夜| 日本精品一区二区三区在线播放视频| 国产成人精品网站| 91国在线精品国内播放| 成人黄色午夜影院| 国产精品视频资源| 国产精品久久久久久一区二区| 亚洲www在线| 日韩中文av在线| 日韩精品中文字幕视频在线| 77777亚洲午夜久久多人| 久久久人成影片一区二区三区| 欧美日韩中文字幕| 久国内精品在线| 国产成人精品综合久久久| 亚洲精品国产精品国自产观看浪潮| 日本午夜精品理论片a级appf发布| 国产精品日韩电影| 国产精品久久久久久搜索| 国产综合香蕉五月婷在线| 亚洲**2019国产| 欧美插天视频在线播放| 日韩免费视频在线观看| 亚洲精品小视频在线观看| 国产精品海角社区在线观看| 午夜精品久久久久久久99热浪潮| 久久91精品国产91久久久| 亚洲毛片一区二区| 成人精品久久av网站| 国产精品中文字幕久久久| 日韩av在线免费观看| 亚洲人精选亚洲人成在线| 久久久天堂国产精品女人| 国语自产偷拍精品视频偷| 夜夜狂射影院欧美极品| 成人av番号网| 国产精品网站视频| 在线成人激情黄色| 亚洲欧洲自拍偷拍| 亚洲色图偷窥自拍| 51精品国产黑色丝袜高跟鞋| 久久久成人av| 欧美一区二区三区免费观看| 国产精品视频最多的网站| 少妇av一区二区三区| 2019中文在线观看| 欧美xxxx做受欧美| 98午夜经典影视| 欧美激情女人20p| 国产美女扒开尿口久久久| 午夜精品一区二区三区视频免费看| 欧美国产欧美亚洲国产日韩mv天天看完整| 91香蕉嫩草神马影院在线观看| 欧美日韩国产中文精品字幕自在自线| 精品国产一区二区三区四区在线观看| 日韩欧美综合在线视频| 尤物99国产成人精品视频| 91久久久久久久久| 欧美在线激情网| 中文字幕亚洲色图| 国内精品久久久久影院优| 亚洲大胆人体视频| 欧美日韩日本国产| 国产91久久婷婷一区二区| 国产精品无码专区在线观看| 精品国内产的精品视频在线观看| 亚洲人成网在线播放| 国内精品小视频在线观看| 日韩在线视频播放| 亚洲国产成人精品女人久久久| www.久久草.com| 久久九九热免费视频| 97超级碰在线看视频免费在线看| 日韩欧美成人免费视频| 亚洲欧美日韩中文视频| 久久久久久一区二区三区| 国产日韩中文字幕在线| 日韩在线观看免费全集电视剧网站| 国产福利视频一区| 亚洲自拍欧美另类| 亚洲性线免费观看视频成熟| 亚洲电影成人av99爱色| 国产福利精品av综合导导航| 国产精品啪视频| 色噜噜狠狠色综合网图区| 欧美成人中文字幕| 欧美伊久线香蕉线新在线| 成人xvideos免费视频| 欧美激情极品视频| 日本国产一区二区三区| 日韩va亚洲va欧洲va国产| 福利微拍一区二区| 亚洲午夜激情免费视频| 久久精品亚洲国产| 久久天天躁狠狠躁夜夜躁2014| 欧美激情欧美激情| 91av在线播放| 欧美日韩一区二区三区在线免费观看| 亚洲一区二区三| 欧美大片欧美激情性色a∨久久| 在线播放国产精品| 国产亚洲精品综合一区91| 欧美激情图片区| 91久久精品美女| 亚洲激情视频网站| 国内精品中文字幕| 亚洲人成在线免费观看| 欧美电影在线播放| 欧美一区二区.| 国产精品99一区| 久久中国妇女中文字幕| 91在线网站视频| 国产精品美乳一区二区免费| 欧美精品国产精品日韩精品| 欧美韩日一区二区| 欧美在线视频导航| 精品在线观看国产| 日韩一二三在线视频播| 国产日本欧美在线观看| 国产第一区电影|