C# 的關(guān)鍵字詳細(xì)介紹
更新時(shí)間:2012年11月13日 09:14:50 作者:
本文將詳細(xì)介紹C#關(guān)鍵字的應(yīng)用,可供有需要的朋友參考
用于修飾類,方法,屬性和字段的關(guān)鍵字:
首先從最簡(jiǎn)單的private,protected,internal,public 解釋。
public 和internal 修飾類。
public,protected,private 修飾方法。
修飾類的時(shí)候:
public 代表公開,也就是所有程序集都可以訪問這個(gè)類。
internal 代表內(nèi)部的,也就是只有在同一程序集中才能訪問這個(gè)類,一般而言同一程序集就是同一個(gè)dll。
修飾方法的時(shí)候:
public 代表公開,也就是所有的類都可以訪問這個(gè)方法。
protected 代表受保護(hù)的,也就是只有我的子類才能訪問這個(gè)方法。
private 代表私有的,也就是只有我才能訪問這個(gè)方法。
接著我們來討論下const,readonly 的區(qū)別:
首先兩者都是常量,不同的是const 是編譯時(shí)常量,readonly是運(yùn)行時(shí)常量。
編譯時(shí)常量:在編譯的時(shí)候,值就已經(jīng)是常量了,任何使用該變量的地方都會(huì)被替換成常量值。
運(yùn)行時(shí)常量:在運(yùn)行的時(shí)候,值不能夠被修改。
public class Test
{
public const string constStr = "this is a test";
public readonly string readonlyStr = "this can't be modified in runtime time";
public void Method1()
{
string s1 = constStr; // 在編譯的時(shí)候,這句話就會(huì)被替換成 string s1 = "this is a test";
readonlyStr = "error";
//嘗試修改readonlyStr,無法通過編譯,
//拋出錯(cuò)誤:readonly 字段只有在構(gòu)造函數(shù)和初始化的時(shí)候才能修改。
}
}
OK,現(xiàn)在我們討論下abstract, virtual , new , override 關(guān)鍵字:
首先abstract 代表的是抽象,abstract 可以修飾類和方法。
修飾類的時(shí)候:
這個(gè)時(shí)候叫做抽象類,抽象類有下列性質(zhì):
抽象類不能實(shí)例化。
抽象類可以包含抽象方法和抽象訪問器,訪問器實(shí)際上也是方法。
不能用 sealed修飾符修飾抽象類,因?yàn)檫@兩個(gè)修飾符的含義是相反的。 采用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對(duì)類進(jìn)行繼承。
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)際實(shí)現(xiàn)。
修飾方法的時(shí)候:
這個(gè)時(shí)候叫做抽象方法,性質(zhì)如下:
抽象方法是隱式的虛方法(用virtual 修飾方法的叫做虛方法)。
只允許在抽象類中使用抽象方法聲明,只要使用抽象方法,那么這個(gè)就是抽象類。
因?yàn)槌橄蠓椒暶鞑惶峁?shí)際的實(shí)現(xiàn),所以沒有方法體;方法聲明只是以一個(gè)分號(hào)結(jié)束,并且在簽名后沒有大括號(hào) ({ })。 例如:
public abstract void MyMethod();
實(shí)現(xiàn)由一個(gè)重寫方法override 提供,此重寫方法是非抽象類的一個(gè)成員。
在抽象方法聲明中使用 static 或 virtual 修飾符是錯(cuò)誤的,因?yàn)槌橄蠓椒ㄐ枰恢貙懀圆荒苡胹tatic修飾,因?yàn)槌橄蠓椒ㄊ请[式的虛方法,所以不能用virtual修飾。
除了在聲明和調(diào)用語法上不同外,抽象屬性的行為與抽象方法一樣,屬性本質(zhì)上是方法。
在靜態(tài)屬性上使用 abstract 修飾符是錯(cuò)誤的。
在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。
virtual 關(guān)鍵字代表虛擬的,虛的,修飾的是方法。
修飾方法的時(shí)候:
這個(gè)時(shí)候叫做虛方法,虛方法代表這個(gè)方法是虛的,這個(gè)方法可能沒有實(shí)現(xiàn),這個(gè)方法可以被重寫。
關(guān)鍵的一句話是:這個(gè)方法可以被重寫。
這代表,如果這個(gè)方法想要被重寫,被override,那么它就必須是一個(gè)虛方法,因?yàn)閍bstract修飾的方法是隱式的虛方法,所以abstract和virtual 修飾的方法可以被override。
override 關(guān)鍵字代表重寫,修飾的是方法。
override 方法提供從基類繼承的成員的新實(shí)現(xiàn)。 由 override 聲明重寫的方法稱為重寫基方法。 重寫的基方法必須與 override 方法具有相同的簽名。
修飾方法的時(shí)候:
1:不能重寫非虛方法或靜態(tài)方法。 重寫的基方法必須是 virtual、abstract 或 override 的。
override 方法和 virtual 方法必須具有相同的訪問級(jí)別修飾符。
2:您不能使用 new、static 或 virtual 修飾符來修改 override 方法。
3:重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須
是 virtual、abstract 或 override 的。
new 關(guān)鍵字代表隱藏,修飾的是方法。
new 和override 的區(qū)別是,new 是隱藏父類方法,這就好比告訴別人,這個(gè)方法和父類的方法是兩個(gè)不同的方法,只是他們的簽名剛好相同罷了,override 則不同,override 告訴別人,以后用我的instance調(diào)用的就是我的方法,用父類的instance調(diào)用的就是父類的方法。
總結(jié)下:abstract,virtual,override,new 的關(guān)系。
override 的方法必須是abstract ,virtual, override 的。
abstract 的方法是隱式的virtual 方法。
virtual 的方法代表這個(gè)方法可以被重寫,當(dāng)然你也可以不重寫它。
abstract的方法代表這個(gè)方法是必須被重寫的方法。
new 的方法代表這個(gè)方法和父類的沒關(guān)系,是一個(gè)新的“new” 方法,只是剛好簽名相同罷了。
最后一道題:
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B : A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class C : B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D : C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Program2
{
static void Main()
{
D d = new D();
A a = d; B b = d;
C c = d; a.F(); b.F();
c.F();
d.F();
}
}

首先從最簡(jiǎn)單的private,protected,internal,public 解釋。
public 和internal 修飾類。
public,protected,private 修飾方法。
修飾類的時(shí)候:
public 代表公開,也就是所有程序集都可以訪問這個(gè)類。
internal 代表內(nèi)部的,也就是只有在同一程序集中才能訪問這個(gè)類,一般而言同一程序集就是同一個(gè)dll。
修飾方法的時(shí)候:
public 代表公開,也就是所有的類都可以訪問這個(gè)方法。
protected 代表受保護(hù)的,也就是只有我的子類才能訪問這個(gè)方法。
private 代表私有的,也就是只有我才能訪問這個(gè)方法。
接著我們來討論下const,readonly 的區(qū)別:
首先兩者都是常量,不同的是const 是編譯時(shí)常量,readonly是運(yùn)行時(shí)常量。
編譯時(shí)常量:在編譯的時(shí)候,值就已經(jīng)是常量了,任何使用該變量的地方都會(huì)被替換成常量值。
運(yùn)行時(shí)常量:在運(yùn)行的時(shí)候,值不能夠被修改。
復(fù)制代碼 代碼如下:
public class Test
{
public const string constStr = "this is a test";
public readonly string readonlyStr = "this can't be modified in runtime time";
public void Method1()
{
string s1 = constStr; // 在編譯的時(shí)候,這句話就會(huì)被替換成 string s1 = "this is a test";
readonlyStr = "error";
//嘗試修改readonlyStr,無法通過編譯,
//拋出錯(cuò)誤:readonly 字段只有在構(gòu)造函數(shù)和初始化的時(shí)候才能修改。
}
}

OK,現(xiàn)在我們討論下abstract, virtual , new , override 關(guān)鍵字:
首先abstract 代表的是抽象,abstract 可以修飾類和方法。
修飾類的時(shí)候:
這個(gè)時(shí)候叫做抽象類,抽象類有下列性質(zhì):
抽象類不能實(shí)例化。
抽象類可以包含抽象方法和抽象訪問器,訪問器實(shí)際上也是方法。
不能用 sealed修飾符修飾抽象類,因?yàn)檫@兩個(gè)修飾符的含義是相反的。 采用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對(duì)類進(jìn)行繼承。
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)際實(shí)現(xiàn)。
修飾方法的時(shí)候:
這個(gè)時(shí)候叫做抽象方法,性質(zhì)如下:
抽象方法是隱式的虛方法(用virtual 修飾方法的叫做虛方法)。
只允許在抽象類中使用抽象方法聲明,只要使用抽象方法,那么這個(gè)就是抽象類。
因?yàn)槌橄蠓椒暶鞑惶峁?shí)際的實(shí)現(xiàn),所以沒有方法體;方法聲明只是以一個(gè)分號(hào)結(jié)束,并且在簽名后沒有大括號(hào) ({ })。 例如:
public abstract void MyMethod();
實(shí)現(xiàn)由一個(gè)重寫方法override 提供,此重寫方法是非抽象類的一個(gè)成員。
在抽象方法聲明中使用 static 或 virtual 修飾符是錯(cuò)誤的,因?yàn)槌橄蠓椒ㄐ枰恢貙懀圆荒苡胹tatic修飾,因?yàn)槌橄蠓椒ㄊ请[式的虛方法,所以不能用virtual修飾。
除了在聲明和調(diào)用語法上不同外,抽象屬性的行為與抽象方法一樣,屬性本質(zhì)上是方法。
在靜態(tài)屬性上使用 abstract 修飾符是錯(cuò)誤的。
在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。
virtual 關(guān)鍵字代表虛擬的,虛的,修飾的是方法。
修飾方法的時(shí)候:
這個(gè)時(shí)候叫做虛方法,虛方法代表這個(gè)方法是虛的,這個(gè)方法可能沒有實(shí)現(xiàn),這個(gè)方法可以被重寫。
關(guān)鍵的一句話是:這個(gè)方法可以被重寫。
這代表,如果這個(gè)方法想要被重寫,被override,那么它就必須是一個(gè)虛方法,因?yàn)閍bstract修飾的方法是隱式的虛方法,所以abstract和virtual 修飾的方法可以被override。
override 關(guān)鍵字代表重寫,修飾的是方法。
override 方法提供從基類繼承的成員的新實(shí)現(xiàn)。 由 override 聲明重寫的方法稱為重寫基方法。 重寫的基方法必須與 override 方法具有相同的簽名。
修飾方法的時(shí)候:
1:不能重寫非虛方法或靜態(tài)方法。 重寫的基方法必須是 virtual、abstract 或 override 的。
override 方法和 virtual 方法必須具有相同的訪問級(jí)別修飾符。
2:您不能使用 new、static 或 virtual 修飾符來修改 override 方法。
3:重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須
是 virtual、abstract 或 override 的。
new 關(guān)鍵字代表隱藏,修飾的是方法。
new 和override 的區(qū)別是,new 是隱藏父類方法,這就好比告訴別人,這個(gè)方法和父類的方法是兩個(gè)不同的方法,只是他們的簽名剛好相同罷了,override 則不同,override 告訴別人,以后用我的instance調(diào)用的就是我的方法,用父類的instance調(diào)用的就是父類的方法。
總結(jié)下:abstract,virtual,override,new 的關(guān)系。
override 的方法必須是abstract ,virtual, override 的。
abstract 的方法是隱式的virtual 方法。
virtual 的方法代表這個(gè)方法可以被重寫,當(dāng)然你也可以不重寫它。
abstract的方法代表這個(gè)方法是必須被重寫的方法。
new 的方法代表這個(gè)方法和父類的沒關(guān)系,是一個(gè)新的“new” 方法,只是剛好簽名相同罷了。
最后一道題:
復(fù)制代碼 代碼如下:
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B : A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class C : B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D : C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Program2
{
static void Main()
{
D d = new D();
A a = d; B b = d;
C c = d; a.F(); b.F();
c.F();
d.F();
}
}
相關(guān)文章
C# Winform 實(shí)現(xiàn)TCP發(fā)消息
這篇文章主要介紹了C# Winform 實(shí)現(xiàn)TCP發(fā)消息的示例,幫助大家更好的理解和學(xué)習(xí)使用c#技術(shù),感興趣的朋友可以了解下2021-03-03c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01jQuery uploadify在谷歌和火狐瀏覽器上傳失敗的解決方案
jquery.uploadify插件是一個(gè)基于jquery來實(shí)現(xiàn)上傳的,這個(gè)插件很好用,每一次向后臺(tái)發(fā)送數(shù)據(jù)流請(qǐng)求時(shí),ie會(huì)自動(dòng)把本地cookie存儲(chǔ)捆綁在一起發(fā)送給服務(wù)器。但firefox、chrome不會(huì)這樣做,他們會(huì)認(rèn)為這樣不安全,下面介紹下jQuery uploadify上傳失敗的解決方案2015-08-08C#實(shí)現(xiàn)Winform鼠標(biāo)拖動(dòng)窗口大小時(shí)設(shè)定窗口最小尺寸的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Winform鼠標(biāo)拖動(dòng)窗口大小時(shí)設(shè)定窗口最小尺寸的方法,涉及WinForm改變窗口大小時(shí)動(dòng)態(tài)判斷當(dāng)前窗口尺寸的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-11-11簡(jiǎn)單聊聊C#字符串構(gòu)建利器StringBuilder
因?yàn)镾tring類型代表不可變字符串,所以無法對(duì)當(dāng)前String類型實(shí)例進(jìn)行處理.所以FCL提供了System.Text.StringBuilder類型,下面這篇文章主要給大家介紹了關(guān)于C#字符串構(gòu)建利器StringBuilder的相關(guān)資料,需要的朋友可以參考下2022-03-03c# Bitmap轉(zhuǎn)bitmapImage高效方法
本文主要介紹了c# Bitmap轉(zhuǎn)bitmapImage高效方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11