[.net 面向對象編程基礎] (8) 基礎中的基礎——修飾符
在進入C#面向對象核心之前,我們需要先對修飾符有所了解,其實我們在前面說到變量和常量的時候,已經使用了修飾符,並且說明了變量和常量的修改符。
首先 修飾符是什么?
修飾符用於限定類型以及類型成員的申明
從定義可以看出按功能分為兩類:訪問修飾符和聲明修飾符
1.訪問修飾符 (5個)
訪問修飾符 |
說明 |
public |
公有訪問。不受任何限制。 |
private |
私有訪問。只限於本類成員訪問,子類,實例都不能訪問。 |
protected |
保護訪問。只限於本類和子類訪問,實例不能訪問。 |
internal |
內部訪問。只限於本項目內訪問,其他不能訪問。 |
protected internal |
內部保護訪問。只限於本項目或是子類訪問,其他不能訪問 |
C#成員類型的可修飾及默認修飾符如下表:
成員類型 |
默認修飾符 |
可被修飾符 |
enum |
public |
none |
class |
private |
public、protected、internal、private、 |
interface |
public |
none |
struct |
private |
public、internal、private |
2.聲明修飾符 (10個)
Partial:在整個同一程序集中定義分部類和結構
Static: 聲明屬於類型本身而不是屬於特定對象的成員。
Abstract:抽象類,只能是其他類的基類。類中的方法只聲明不實現,方法的實現在他的派生類中完成。
Sealed:指定類不能被繼承。
Virtual:用於修飾方法、屬性、索引器或事件聲明,並且允許在派生類中重寫這些對象
Override:提供從基類繼承的成員的新實現
New:作修飾符,隱藏從基類成員繼承的成員,在不使用 new 修飾符的情況下隱藏成員是允許的,但會生成警告。作運算符,用於創建對象和調用構造函數。
Extern:用於聲明在外部實現的方法。 extern 修飾符的常見用法是在使用 Interop 服務調入非托管代碼時與 DllImport 特性一起使用。 在這種情況下,還必須將方法聲明為 static
Readonly:修飾字段,表示該字段為只讀字段。
注意:readonly修飾引用類型時由於操作不當可能修改該只讀對象狀態。例如:Readonly List< Person> persons=….;
我們可能在某些地方對persons 進行了修改:persons.add(new Person());
Const:修飾字段,表示該字段為只讀字段。並且在編譯時必須能夠明確知道該字段的值,其值是硬編碼到程序中去的,修改了該類型成員后需要重新編譯才能使修改生效。
而readonly是運行時只讀,內容在運行時確定,所以修改了readonly類型成員后無需重新編譯即可生效。
Readonly不能修飾局部變量,const可以。
要點:
Virtual,override和new 的區別
virtual 用於父類中,聲明某方法可以重寫,該方法不能是static;
override(覆蓋繼承) 用於子類中,重寫父類中用virtual/override/abstract關鍵字聲明的方法;
new(隱藏繼承) 用於子類中,可修飾父類中有或無virtual聲明的方法;
如果在父類中有與父類同名同參的方法時,C#會隱式在子類前添加一個new關鍵字。
【區別】override與new
當將一個子類實例賦值給父類實例,在子類實例與父類實例中分別調用該方法時:使用override修飾的都將調用子類方法,而使用new修飾的會分別調用子類方法和父類方法。
New和Override這兩個關鍵字是互斥的。不可以同時使用。
【區別】virtual與abstract
virtual:用於父類中聲明該方法可被重寫。
abstract:只能用在抽象類中聲明抽象方法,本身不能實現任何功能(因此必須在子類中override),不能實例化。
兩者除了在子類中同樣可以用override重寫這個相同點之外,沒有其他關系。
==============================================================================================
返回目錄
<如果對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>
==============================================================================================