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

首先從最簡單的private,protected,internal,public 解釋。
public 和internal 修飾類。
public,protected,private 修飾方法。
修飾類的時候:
public 代表公開,也就是所有程序集都可以訪問這個類。
internal 代表內(nèi)部的,也就是只有在同一程序集中才能訪問這個類,一般而言同一程序集就是同一個dll。
修飾方法的時候:
public 代表公開,也就是所有的類都可以訪問這個方法。
protected 代表受保護的,也就是只有我的子類才能訪問這個方法。
private 代表私有的,也就是只有我才能訪問這個方法。
接著我們來討論下const,readonly 的區(qū)別:
首先兩者都是常量,不同的是const 是編譯時常量,readonly是運行時常量。
編譯時常量:在編譯的時候,值就已經(jīng)是常量了,任何使用該變量的地方都會被替換成常量值。
運行時常量:在運行的時候,值不能夠被修改。
復(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; // 在編譯的時候,這句話就會被替換成 string s1 = "this is a test";
readonlyStr = "error";
//嘗試修改readonlyStr,無法通過編譯,
//拋出錯誤:readonly 字段只有在構(gòu)造函數(shù)和初始化的時候才能修改。
}
}
OK,現(xiàn)在我們討論下abstract, virtual , new , override 關(guān)鍵字:
首先abstract 代表的是抽象,abstract 可以修飾類和方法。
修飾類的時候:
這個時候叫做抽象類,抽象類有下列性質(zhì):
抽象類不能實例化。
抽象類可以包含抽象方法和抽象訪問器,訪問器實際上也是方法。
不能用 sealed修飾符修飾抽象類,因為這兩個修飾符的含義是相反的。 采用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進行繼承。
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現(xiàn)。
修飾方法的時候:
這個時候叫做抽象方法,性質(zhì)如下:
抽象方法是隱式的虛方法(用virtual 修飾方法的叫做虛方法)。
只允許在抽象類中使用抽象方法聲明,只要使用抽象方法,那么這個就是抽象類。
因為抽象方法聲明不提供實際的實現(xiàn),所以沒有方法體;方法聲明只是以一個分號結(jié)束,并且在簽名后沒有大括號 ({ })。 例如:
public abstract void MyMethod();
實現(xiàn)由一個重寫方法override 提供,此重寫方法是非抽象類的一個成員。
在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的,因為抽象方法需要被重寫,所以不能用static修飾,因為抽象方法是隱式的虛方法,所以不能用virtual修飾。
除了在聲明和調(diào)用語法上不同外,抽象屬性的行為與抽象方法一樣,屬性本質(zhì)上是方法。
在靜態(tài)屬性上使用 abstract 修飾符是錯誤的。
在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。
virtual 關(guān)鍵字代表虛擬的,虛的,修飾的是方法。
修飾方法的時候:
這個時候叫做虛方法,虛方法代表這個方法是虛的,這個方法可能沒有實現(xiàn),這個方法可以被重寫。
關(guān)鍵的一句話是:這個方法可以被重寫。
這代表,如果這個方法想要被重寫,被override,那么它就必須是一個虛方法,因為abstract修飾的方法是隱式的虛方法,所以abstract和virtual 修飾的方法可以被override。
override 關(guān)鍵字代表重寫,修飾的是方法。
override 方法提供從基類繼承的成員的新實現(xiàn)。 由 override 聲明重寫的方法稱為重寫基方法。 重寫的基方法必須與 override 方法具有相同的簽名。
修飾方法的時候:
1:不能重寫非虛方法或靜態(tài)方法。 重寫的基方法必須是 virtual、abstract 或 override 的。
override 方法和 virtual 方法必須具有相同的訪問級別修飾符。
2:您不能使用 new、static 或 virtual 修飾符來修改 override 方法。
3:重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須
是 virtual、abstract 或 override 的。
new 關(guān)鍵字代表隱藏,修飾的是方法。
new 和override 的區(qū)別是,new 是隱藏父類方法,這就好比告訴別人,這個方法和父類的方法是兩個不同的方法,只是他們的簽名剛好相同罷了,override 則不同,override 告訴別人,以后用我的instance調(diào)用的就是我的方法,用父類的instance調(diào)用的就是父類的方法。
總結(jié)下:abstract,virtual,override,new 的關(guān)系。
override 的方法必須是abstract ,virtual, override 的。
abstract 的方法是隱式的virtual 方法。
virtual 的方法代表這個方法可以被重寫,當然你也可以不重寫它。
abstract的方法代表這個方法是必須被重寫的方法。
new 的方法代表這個方法和父類的沒關(guān)系,是一個新的“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)文章
jQuery uploadify在谷歌和火狐瀏覽器上傳失敗的解決方案
jquery.uploadify插件是一個基于jquery來實現(xiàn)上傳的,這個插件很好用,每一次向后臺發(fā)送數(shù)據(jù)流請求時,ie會自動把本地cookie存儲捆綁在一起發(fā)送給服務(wù)器。但firefox、chrome不會這樣做,他們會認為這樣不安全,下面介紹下jQuery uploadify上傳失敗的解決方案2015-08-08
C#實現(xiàn)Winform鼠標拖動窗口大小時設(shè)定窗口最小尺寸的方法
這篇文章主要介紹了C#實現(xiàn)Winform鼠標拖動窗口大小時設(shè)定窗口最小尺寸的方法,涉及WinForm改變窗口大小時動態(tài)判斷當前窗口尺寸的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下2015-11-11
簡單聊聊C#字符串構(gòu)建利器StringBuilder
因為String類型代表不可變字符串,所以無法對當前String類型實例進行處理.所以FCL提供了System.Text.StringBuilder類型,下面這篇文章主要給大家介紹了關(guān)于C#字符串構(gòu)建利器StringBuilder的相關(guān)資料,需要的朋友可以參考下2022-03-03
c# Bitmap轉(zhuǎn)bitmapImage高效方法
本文主要介紹了c# Bitmap轉(zhuǎn)bitmapImage高效方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11

