說白了構造函數就是用來初始化類的數據成員{由於C#語言具備類型安全的特質-->不能使用沒有初始化的變量)}html
在這裏引用一下別人的總結,我以爲挺好的:安全
構造函數是一種特殊的成員函數,它主要用於爲對象分配存儲空間,對數據成員進行初始化.app
構造函數具備一些特質:dom
(1).構造函數必須與類同名;函數
(2).構造函數沒有返回類型,它能夠帶參數,也能夠不帶參數;字體
(3).一個類中能夠有一個或多個構造函數,也就是說構造函數能夠重載,從而提供初始化類對象的不一樣方法;ui
(4).聲明類對象時,系統自動調用構造函數,構造函數不能被顯式調用;this
(5).若在聲明時未定義構造函數,系統會自動生成默認的構造函數,此時構造函數的函數體爲空.spa
(6).靜態構造函數,用static修飾,用於初始化靜態變量,一個類只容許有一個靜態構造函數,在類實例化時加載,這時修飾符public、private失去做用.3d
{
靜態構造函數既沒有訪問修飾符,也沒有參數。
在建立第一個實例或引用任何靜態成員以前,將自動調用靜態構造函數來初始化類。
沒法直接調用靜態構造函數。在程序中,用戶沒法控制什麼時候執行靜態構造函數。
靜態構造函數的典型用途是:當類使用日誌文件時,將使用這種構造函數向日志文件中寫入項。
靜態構造函數在爲非託管代碼建立包裝類時也頗有用,此時該構造函數能夠調用 LoadLibrary 方法。
若是靜態構造函數引起異常,運行時將不會再次調用該構造函數,而且在程序運行所在的應用程序域的生存期內,類型將保持未初始化}
(7)可使用public、protected、private修飾符;
(8)引用父類構造時用():base()方法,引用自身重載的構造使用():this(int para);
這裏代碼舉例就只列舉 base和this的用法,也是別人的列子,拿來用的,我以爲說得挺通俗易懂的
public class ConstructorProgram
{
private string name;
private int age;
public ConstructorProgram():this("bell")
{
//Console.WriteLine("No Info Left.");
}
public ConstructorProgram(string name)
:this("Simple Programmer",20)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
在上面的代碼當中,能夠看出來這裏紅色字體的this用來調用ConstructorProgram類的自身的構造函數。明白這句話的涵義,應該會明白執行結果了。
public static void Main()
{
ConstructorProgram cp1= new ConstructorProgram("goal");
ConstructorProgram cp2 = new ConstructorProgram();
}
}
運行結果:
name=Simple Programmer
age=20
name=goal
name=Simple Programmer
age=20
name=bell
在上面的代碼當中,能夠看出來這裏紅色字體的this用來調用ConstructorProgram類的自身的構造函數。明白這句話的涵義,應該會明白執行結果了。
接着下面的代碼以下:
public class ConstructorProgram1
{
private string name;
private int age;
public ConstructorProgram1()
{
Console.WriteLine("No Info Left");
}
public ConstructorProgram1(string name)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram1(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
}
public class ConstructorProgram : ConstructorProgram1
{
public ConstructorProgram()
{
//Console.WriteLine("sdfsdf");
}
public ConstructorProgram(string name)
: base("goalbell",20)
{
Console.WriteLine("name=" + name);
}
public static void Main()
{
ConstructorProgram cp = new ConstructorProgram("Programmer");
}
}
運行結果以下:
name=goalbell
age=20
name=Programmer
能夠看出上面的代碼,派生類中的base調用了父類(基類)的構造函數了,可是若是不提供初始化(即把 : base("goalbell",20)
不要)指向基類的構造函數的話,它會執行基類中沒有參數的構造函數。
會獲得以下結果:
name=goalbell
age=20
name=Programmer
No Info Left
也就是說BASE是對父類的引用,而THIS是對類自己本身的引用。
在看下下面的代碼,(基類和派生類中的構造函數關係)
using System;
namespace Zjw.Csharp
{
public class ConstructorProgram1
{
private string name;
public ConstructorProgram1()
{
Console.WriteLine("No Info Left");
}
public ConstructorProgram1(string name)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
}
public class ConstructorProgram:ConstructorProgram1
{
private string name;
private int age;
public ConstructorProgram():this("bell")
{
//Console.WriteLine("No Info Left.");
}
public ConstructorProgram(string name)
:this("Simple Programmer",20)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
public static void Main()
{
ConstructorProgram cp1= new ConstructorProgram("goal");
ConstructorProgram cp2 = new ConstructorProgram();
Console.ReadLine();
}
}
}
執行結果是
No Info Left
name=Simple Programmer
age=20
name=goal
No Info Left
name=Simple Programmer
age=20
name=bell
能夠獲得的結論是 派生類先調用父類的構造函數進行初始化,再調用繼承類的構造函數,若是沒有在繼承類中指明父類的構造函數,則默認調用父類中沒有參數的構造函數,而後調用繼承類的構造函數。
轉自 ;https://www.cnblogs.com/siyecao/archive/2012/05/17/2506375.html