2010-09-02 46 views
13

我想知道C#中的protected是什麼意思,爲什麼我們使用它,以及關鍵字的好處?受保護的關鍵字C#

例如

protected int currentColorIndex;

請詳細說明。

+5

只是覺得它*必須*是重複的,但我無法在其他地方找到完全相同的問題。 – serg10 2010-09-02 11:48:21

+1

既然您已經從這些答案中獲得了基本知識,那麼您可能需要深入研究一些微妙之處。請參閱http://blogs.msdn.com/b/ericlippert/archive/tags/protected/中的一些。 – 2010-09-02 14:27:39

+0

相關:http://stackoverflow.com/questions/3500298/what-is-the-difference-between-access-specifier-protected-and-internal-protected – 2010-09-02 17:16:07

回答

14

「被保護的成員是從 其所 聲明的類中訪問,並從從宣佈 該成員的類派生的任何類 之內。」

看到

http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx

+5

-1:不回答「我們爲什麼使用它」。 – Timwi 2010-09-02 11:54:23

+0

但先生,而不是宣佈受到保護,我們也可以使用作爲私人根據你的答案。 – 2010-09-02 12:11:33

+3

@Nishant - 不是這樣的:'私人'限制成員只能被這個類使用,而對其他任何類都不可見。 – 2010-09-02 14:34:35

3

這意味着該字段只類本身和繼承類可見。從MSDN

7

直:

protected關鍵字是一個成員訪問修飾符。受保護的成員可以在其類和派生類實例中訪問。

Source

使用保護意味着你可以在一類是提供給派生類具有的功能,但不只是實例化對象的類。

This page比較不同的訪問修飾符,並解釋它們的含義,並給出不同對象(枚舉,類,接口和結構)的默認修飾符表。

6

定義在另一個答案中提供。爲什麼這很好?當protected允許他們訪問基類實現時,不需要將基類中的數據/代碼複製到其派生類,而不會不必要地暴露於public暗示的不受限制的外部使用。

14

正如其他人已經指出:

protected關鍵字是一個成員 訪問修飾符。受保護的成員是 其類中可訪問,並且由 派生類實例。

這裏是一個小例子:

public class A 
{ 
    protected string SomeString; 
    public string SomeOtherString; 
} 

public class B : A 
{ 
    public string Wrapped 
    { 
     get { return this.SomeString; } 
    } 
} 

... 

var a = new A(); 
var s = a.SomeOtherString; // valid 
var s2 = a.SomeString; // Error 

var b = new B(); 
var s3 = b.Wrapped; // valid 
+0

很好的解釋先生.... – 2010-09-02 12:16:07

+0

感謝您的清晰和良好的解釋先生 – 2010-09-02 12:18:52

+0

不客氣。 – 2010-09-02 12:23:29

31

每個人的答案是相似的(定義和/或摘錄/鏈接到MSDN),所以生病嘗試回答你原來的3個問題:

含義:

任何標有'protected'的字段意味着它只對本身和任何子類(從它繼承的類)都是可見的。你會注意到在ASP中。NET Web Forms代碼隱藏在模型後面,事件處理程序(如Page_Load)被標記爲「受保護」。這是因爲ASPX標記文件實際上從代碼隱藏文件繼承(查看@Page指令來證明這一點)。

我們爲什麼使用它:

共同使用保護可訪問修飾符的是給孩子訪問它的父母性能。您可能有許多子類派生自的基類。這個基類可能有一個共同的屬性。對於受保護的財產來說,這是一個很好的例子 - 以促進共同邏輯的重用和集中維護。

效益:

一種類似的問題,以 「我們爲什麼使用它?」但基本上它可以對屬性進行粗粒度控制。你不能只想到「當你使用保護」。這更多的是選擇何時使用哪種可訪問性修飾符(私有,公共,內部,受保護)的情況。所以這個好處與任何可訪問性修飾符的好處是一樣的 - 提供一個健壯和一致的對象模型,最大限度地利用代碼並最大限度地減少與錯誤暴露的代碼相關的安全風險。

希望有所幫助。

+0

是否可以在抽象類中訪問受保護的方法,或者我們是否需要重寫它?例如,我有一個名爲「爸爸」的類,它有一個'保護無效WalkingAndRunning()'方法。 「爸爸」班由「兒子」班繼承。有沒有可能在那裏使用'protected void WalkingAndRunning()'方法?只是好奇。 – Musikero31 2011-12-02 07:10:46

3

想想這樣吧。一類呈現三個接口:

  1. 邁向本身,全面進入內部實現細節(公有,保護,私有方法和屬性)。根據定義,任何你在課堂上做的事情都可能影響其他任何事情。
  2. 朝向其客戶端,只能訪問公共方法和屬性。爲了最大限度地減少變化的意外後果,您最大限度地減少了一個類的公共接口:越少的代碼知道你的內部,越可以隨意修改它們。
  3. 朝其後代,有權訪問公衆和受保護的方法和屬性。無論你做什麼保護和公共方法,不僅會影響客戶,還會影響修改班級基本功能的後代。 OO約減少coupling並增加cohesion類之間沒有比繼承關係更強的耦合(當然,除了C++ friend之外)!

第三個接口是OO中最難的通用設計挑戰:可以合理地重寫什麼(虛擬方法和屬性),以及爲了重寫需要什麼其他功能(普通保護方法和屬性)?因爲這是一個很大的挑戰,默認情況下類別爲sealed實際上是一個好主意,與OO初學者經常相似,這似乎是一個不必要的障礙。