做vi的網(wǎng)站cpu優(yōu)化軟件
目錄
一、構(gòu)造函數(shù)的作用
二、構(gòu)造函數(shù)的特征
三、三種構(gòu)造函數(shù)介紹
1、實(shí)例構(gòu)造函數(shù)
2、靜態(tài)構(gòu)造函數(shù)
3、私有構(gòu)造函數(shù)
一、構(gòu)造函數(shù)的作用
? ? ? ?構(gòu)造函數(shù)用來(lái)創(chuàng)建對(duì)象,并且可以在構(gòu)造函數(shù)中對(duì)此對(duì)象進(jìn)行初始化。構(gòu)造函數(shù)具有與類相同的名稱,它通常用來(lái)初始化對(duì)象的數(shù)據(jù)成員。
? ? ? ? C#中構(gòu)造函是在創(chuàng)建給定類型的對(duì)象時(shí)執(zhí)行的類方法。構(gòu)造函數(shù)是一個(gè)特殊的方法,無(wú)論什么時(shí)候,只要使用new運(yùn)算符實(shí)例化對(duì)象,并且不為 new 提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。除非類是靜態(tài)的,否則C#編譯器將為無(wú)構(gòu)造函數(shù)的類提供一個(gè)公共的默認(rèn)構(gòu)造函數(shù),以便該類可以實(shí)例化。在new實(shí)例化類的過(guò)程中,會(huì)執(zhí)行類內(nèi)對(duì)應(yīng)的構(gòu)造函數(shù)進(jìn)行初始化,若無(wú)構(gòu)造函數(shù)的,則會(huì)自動(dòng)調(diào)用無(wú)參默認(rèn)構(gòu)造函數(shù),靜態(tài)構(gòu)造函數(shù)會(huì)在創(chuàng)建第一個(gè)實(shí)例或引用任何靜態(tài)成員之前,將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)以初始化類。
構(gòu)造函數(shù)的分類可以為:實(shí)例構(gòu)造函數(shù)、靜態(tài)構(gòu)造函數(shù)、私有構(gòu)造函數(shù)
二、構(gòu)造函數(shù)的特征
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{class Program{static void Main(string[] args){student st = new student(10, "lihua") { ID = 10, number = 5 };//構(gòu)造函數(shù)可以在實(shí)例化過(guò)程中初始化私有的屬性,{ }大括號(hào)可以初始化公有屬性的數(shù)據(jù)st.ccn();st.Info();Console.Read();}}public class student{private string name;private int age;public int ID;public int number;public student(){ }public student(int age,string name){this.age = age;this.name = name;}public void ccn(){Console.WriteLine("該學(xué)生的名字為:"+name+" "+"年齡為:"+age);}public void Info(){Console.WriteLine("該學(xué)生的學(xué)號(hào)為:" + ID + " " + "名次為:" + number);}}
}
- 構(gòu)造函數(shù)可以有重載!
- 構(gòu)造函數(shù)沒(méi)有返回值,連void也不能寫。
- ?構(gòu)造函數(shù)的名稱必須跟類名一樣。
- 構(gòu)造函數(shù)的訪問(wèn)修飾符一般情況下訪問(wèn)修飾符為public(當(dāng)然也有private)。
- 構(gòu)造函數(shù)不能直接被調(diào)用,必須通過(guò)關(guān)鍵字new在創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用。
- 不帶參數(shù)的構(gòu)造函數(shù)稱為“默認(rèn)構(gòu)造函數(shù)”。無(wú)論何時(shí),只要使用new運(yùn)算符實(shí)例化對(duì)象,并且不為new提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。(即創(chuàng)建構(gòu)造方法(函數(shù))后,在類當(dāng)中會(huì)生成一個(gè)一默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),但是當(dāng)你寫個(gè)新的構(gòu)造函數(shù)之后,不管是有參數(shù)的還是無(wú)參數(shù)的,那個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù)都被干掉了)。
- 如果一個(gè)類中定義了有參構(gòu)造函數(shù),實(shí)例化時(shí)需要調(diào)用無(wú)參構(gòu)造函數(shù),這時(shí)我們就必須定義一個(gè)顯式無(wú)參數(shù)構(gòu)造函數(shù),否則運(yùn)行會(huì)報(bào)錯(cuò)。
三、三種構(gòu)造函數(shù)介紹
1、實(shí)例構(gòu)造函數(shù)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace _2022_07_19
{class Student{public Student(string name, int age, char gender, int id){this.Name = name;this.Age = age;this.Gender = gender;this.Id = id;}public string Name;public int Age;public char Gender;public int Id;public Student(string name, int age, char gender){this.Name = name;this.Age = age;this.Gender = gender;}public void SayHello1(){Console.WriteLine("我叫{0},我今年{1},我是{2}生,我的學(xué)號(hào)是{3}。",Name,Age,Gender,Id);}public void SayHello2(){Console.WriteLine("我叫{0},我今年{1},我是{2}生。", Name, Age, Gender);}}
}
?注意:1、定義了有參構(gòu)造函數(shù),則不能再使用無(wú)參默認(rèn)構(gòu)造函數(shù),也就是在new實(shí)例化的時(shí)候必須在構(gòu)造函數(shù)內(nèi)傳入?yún)?shù)。
2、構(gòu)造函數(shù)可以重載,在定義了有參構(gòu)造函數(shù)后可以重寫一個(gè)無(wú)參構(gòu)造函數(shù),就可以使用無(wú)參構(gòu)造函數(shù)了,否則將報(bào)錯(cuò)。
2、靜態(tài)構(gòu)造函數(shù)
? ? ?在C#中,可以為類定義靜態(tài)構(gòu)造函數(shù),這種構(gòu)造函數(shù)只執(zhí)行一次。編寫靜態(tài)構(gòu)造函數(shù)的主要原因是類有一些靜態(tài)字段或?qū)傩?#xff0c;需要在第一次使用類之前,從外部源中初始化這些靜態(tài)字段或?qū)傩?。在定義靜態(tài)構(gòu)造函數(shù)時(shí),不能設(shè)置訪問(wèn)修飾符,因?yàn)槠渌鸆#代碼從來(lái)不會(huì)調(diào)用它,它只在引用類之前執(zhí)行一次;另外,靜態(tài)構(gòu)造函數(shù)不能帶任何參數(shù),而且一個(gè)類中只能有一個(gè)靜態(tài)構(gòu)造函數(shù),它只能訪問(wèn)靜態(tài)成員,不能訪問(wèn)實(shí)例成員。? 在類中,靜態(tài)構(gòu)造函數(shù)和無(wú)參數(shù)的實(shí)例構(gòu)造函數(shù)是可以共存的,因?yàn)殪o態(tài)構(gòu)造函數(shù)是在加載類時(shí)執(zhí)行的,而無(wú)參數(shù)的實(shí)例構(gòu)造函數(shù)是在創(chuàng)建類的對(duì)象時(shí)執(zhí)行的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{class Program{static void Main(string[] args){student st = new student(10, "lihua") { ID = 10, number = 5 };st.ccn();st.Info();Console.Read();}}public class student{private string name;private int age;public int ID;public int number;public student(){ }static student(){Console.WriteLine("這里是靜態(tài)構(gòu)造函數(shù)");}public student(int age,string name){this.age = age;this.name = name;}public void ccn(){Console.WriteLine("該學(xué)生的名字為:"+name+" "+"年齡為:"+age);}public void Info(){Console.WriteLine("該學(xué)生的學(xué)號(hào)為:" + ID + " " + "名次為:" + number);}}
}
- 靜態(tài)構(gòu)造函數(shù)不使用訪問(wèn)修飾符或不具有參數(shù)。
- 在創(chuàng)建第一個(gè)實(shí)例或引用任何靜態(tài)成員之前,將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)以初始化類。
- 不能直接調(diào)用靜態(tài)構(gòu)造函數(shù)。
- 無(wú)法控制在程序中執(zhí)行靜態(tài)構(gòu)造函數(shù)的時(shí)間。
- 靜態(tài)構(gòu)造函數(shù)的一種典型用法是在類使用日志文件且將構(gòu)造函數(shù)用于將條目寫入到此文件中時(shí)使用。
- 靜態(tài)構(gòu)造函數(shù)對(duì)于創(chuàng)建非托管代碼的包裝類也非常有用,這種情況下構(gòu)造函數(shù)可調(diào)用 LoadLibrary 方法。
- 如果靜態(tài)構(gòu)造函數(shù)引發(fā)異常,運(yùn)行時(shí)將不會(huì)再次調(diào)用該函數(shù),并且類型在程序運(yùn)行所在的應(yīng)用程序域的生存期內(nèi)將保持未初始化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApp2
{class Program{public static int X = 0;//靜態(tài)變量//實(shí)例構(gòu)造函數(shù)public Program(){X = 1;}//靜態(tài)構(gòu)造函數(shù)static Program(){X = 2;//第二步,執(zhí)行靜態(tài)構(gòu)造函數(shù)}//第一步,程序入口Main最先執(zhí)行,然后執(zhí)行靜態(tài)變量public static int X = 0static void Main(string[] args){Console.WriteLine(X);//結(jié)果為2Program dd = new Program();//第三步,執(zhí)行構(gòu)造函數(shù)Console.WriteLine(X);//結(jié)果為1Console.ReadLine();}}
}
??????調(diào)用類的靜態(tài)函數(shù)時(shí)的執(zhí)行順序:
- 靜態(tài)變量==>靜態(tài)構(gòu)造函數(shù)==>實(shí)例構(gòu)造函數(shù)
- 靜態(tài)變量==>靜態(tài)構(gòu)造函數(shù)==>靜態(tài)函數(shù)
????????那么調(diào)用類的實(shí)例函數(shù)時(shí)的執(zhí)行順序則是:
- 非靜態(tài)變量==>實(shí)例構(gòu)造函數(shù)==>實(shí)例函數(shù)
3、私有構(gòu)造函數(shù)
? ? ? ?私有構(gòu)造函數(shù)是一種特殊的實(shí)例構(gòu)造函數(shù)。 它通常只在包含靜態(tài)成員的類中。 如果類具有一個(gè)或多個(gè)私有構(gòu)造函數(shù)而沒(méi)有公共構(gòu)造函數(shù),則在其他類(除嵌套類外)中無(wú)法進(jìn)行實(shí)例化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApp2
{class Program{int i = 0;private Program(){i = 9;}static void Main(string[] args){Program ss = new Program();Console.WriteLine($"i={ss.i}");//運(yùn)行結(jié)果:i=9Console.ReadLine();}}class person{//Program ddd = new Program();//注釋打開(kāi)會(huì)報(bào)錯(cuò),錯(cuò)誤信息:不可訪問(wèn),因?yàn)樗鼙Wo(hù)級(jí)別限制。因?yàn)樗接袠?gòu)造函數(shù)無(wú)法在類的外面實(shí)例化。}
參考文獻(xiàn):
【精選】C# 第五章『面向?qū)ο蟆弧舻?節(jié):構(gòu)造函數(shù)(方法)_c#構(gòu)造方法-CSDN博客?