構造方法重載
普通方法構成重載的規則:方法名稱一樣,對應位置參數的類型或個數不同可以構成方法重載而構造方法的構成規則與此一樣
注意事項:如果方法的通路修飾符是private(還有其他的通路修飾符之後再說),在外部無論是普通方法還是構造方法都顯示沒有該方法的重載(該重載方法隻能在類内部使用)
外部無法使用私有的構造方法
一旦定義了構造方法的重載,在建立新對象時就可以在通路在外部能通路的此類的所有構造方法的重載
//還是之前的學生類的示例
class Student //定義一個學生類
{
//添加一個無參數的構造方法
public Student()
{ }
//重載1
//對應位置參數個數不同
public Student(string name, char gender, string sname)
{
//為各個屬性通過構造方法指派
//this代表目前對象
this.SName = name;
this.SCname = sname;
this.SGender = gender;
}
//重載2
//對應位置參數類型不同
public Student(string name, string sname, char gender)
{
this.SName = name;
this.SCname = sname;
this.SGender = gender;
}
//重載3 隻能在類内部使用
//定義為私有的構造方法
//外部建立對象時沒有該方法的重載
private Student(string name, string sname)
{
this.SName = name;
this.SCname = sname;
//直接在構造方法内部指派
this.SGender = '男';
}
}
重載的構造方法間的調用
之前說過構造方法可以調用普通方法,普通方法無法調用構造方法,但是構造方法間可以互相調用
調用方式:通過構造方法名()冒号加this(參數清單)的方式調用其他的重載方法
調用類型: 1)調用重載的構造方法 2)調用重載方法的參數
1)調用重載方法
//定義一個教師類
class Teacher
{
//定義字段與屬性
private string tName;
public string TName
{
get { return tName; }
set { tName = value; }
}
private char tGender;
public char TGender
{
get { return tGender; }
set { tGender = value; }
}
private int tAge;
public int TAge
{
get { return tAge; }
set { tAge = value; }
}
//定義構造方法 1号
public Teacher(string name, char gender, int age)
: this(name, gender)//調用重載1
{
Console.WriteLine("調用三個參數的構造方法");
}
//重載1 2号
public Teacher(string name, char gender)
{
Console.WriteLine("調用兩個參數的構造方法");
}
//重載2 3号
public Teacher(string name)
{
Console.WriteLine("調用一個參數的構造方法");
}
}
class Program //程式預設添加的程式類
{
static void Main(string[] args)
{
Teacher tc1 = new Teacher("張桂梅", '女',65);
//建立對象時首先調用1号,在調用1号時調用2号,
//調用2号時又調用了3号
//執行時,首先執行3号中的代碼,然後執行2号中的代碼
//最後執行1号的中執行
Teacher tc2 = new Teacher("張桂梅", '女');
//隻會調用2号與3号,調用順序是2号一>3号
//執行順序是 3号一>2号
Teacher tc3 = new Teacher("張桂梅");
//隻會調用3号
//三者調用順序隻能是由參數多的調用參數少的
//自己測試參數個數相同,對應位置類型不同的構造方法
//1号可以調用 2與3号
//2号可以調用3号,不能調用1号
//3号隻有自己
Console.ReadKey();
}
}
調用構造方法
注意事項:構造方法隻能調用一次另一個構造方法并且是調用比自己參數少的
2)調用構造方法的參數
調用構造與普通方法
//3個構造方法的重載
//1号
public Teacher(string name, char gender, int age)
: this(name, gender)
//此構造方法中的參數名稱與this裡面的參數名必須一樣
//下面2号中參數名可以與此構造方法和this中的參數名不一樣
//此時構造方法和this中的參數可以當做是"實參"
//2号中的參數名可以當做是"形參"
//之前說過實參與形參可以一樣也可以不一樣
{
//為屬性指派
//this.TName = name;//通過3号指派
//this.TGender = gender;//通過2号指派
this.TAge = age;//隻能通過自己指派
}
//2号
public Teacher(string name1, char gender)
: this(name1)
//構造方法中的name1與this中的name1可以不一樣
//name1的值由1号構造方法中name的值傳遞過來
//與1号 相當于實參與形參名不一樣
{
//this.TName=name1;//通過3号指派
this.TGender = gender;
}
//3号
public Teacher(string name1)
{
//與2号 相當于實參與形參名一樣
//隻有一個參數,隻能自己指派
this.TName = name1;
}
//在建立對象調用構造方法時
//上面說過三種構造方法的重載調用順序
//在1号中前兩個屬性的指派可以通過
//調用的2号與2号調用3号中指派對
//前兩個屬性進行指派
//是以1号中前兩個可以不用指派
//2号在第一個屬性可以通過調用3号中進行指派
//是以2号中也可以省略第一個參數的指派
//對有許多參數的構造方法非常有用
//如非特别要求可以使用此方式
//如果怕容易混淆,就各賦各的
//普通方法
public void SayHi()
{
Console.WriteLine("勵志 {0}校長:{1},也是一位優秀的 {0}\"教師\",今年馬上{2}歲了", TGender, tName,tAge);
}
//Main方法中建立對象,調用其構造方法與普通方法
static void Main(string[] args)
{
Teacher tc1 = new Teacher("張桂梅", '女', 66);
tc1.SayHi();
//調用1号構造方法時,
//會将第一個參數的值傳遞給3号
//将第二個參數傳遞給2号
//第三個參數值通過自己内部指派
Console.WriteLine("");
Teacher tc2 = new Teacher("張桂梅", '女');
tc2.SayHi();
//調用2号構造方法時
//将第一個參數的值傳遞給3号
//第二個參數通過自己内部指派
Console.WriteLine("");
Teacher tc3 = new Teacher("張桂梅");
tc3.SayHi();
Console.ReadKey();
}
析構方法(*)
析構方法了解為主,以前C++語言需要使用此方法"手動"釋放資源(就是釋放所占用的記憶體)此"手動"指編寫在析構方法中的代碼,運作時還是自動調用
析構方法是在釋放非托管資源(包括之後說的檔案流,資料庫的連接配接等)時使用的(托管資源由C#中垃圾回收機制不定時進行釋放資源);如非必要此方法基本不用
析構方法的文法格式
~析構方法名() //必須與類名相同
{
編寫需要釋放資源的代碼
}
注意事項:
1)析構方法既沒有通路修飾符,也沒有參數,是以一個類隻能有一個析構方法
3)析構方法沒有重載(也不能繼承)
4)隻能定義在類中,不能定義在結構中,是以結構中沒有析構方法
5)與構造方法一樣沒有被手動調用,隻有自動調用
class Teacher
{
//析構方法
~Teacher()
{
Console.WriteLine("此對象所占資源(就是程式所占的記憶體)通過析構方法釋放了");
Console.ReadKey();
//按回車健即可執行析構方法
}
}
static void Main(string[] args)
{
Teacher tc1 = new Teacher("張桂梅", '女', 66);
tc1.SayHi();
Console.ReadKey();
}
調用了析構方法