2011-09-24 83 views
4

我看到很多代碼使用自動生成的屬性,如{get; private set;}{get; protected set;}自動生成的屬性{get; set;} vs {get;私人或保護集;}在C#

這個privateprotected集有什麼優勢?

我試過這段代碼,但是當我有Foo{get; set;}時,它是一樣的。

public class MyClass 
{ 
    public int Foo {get; private set;} 
    public static void RunSnippet() 
    { 
     var x = new MyClass(); 
     x.Foo = 30; 
     Console.WriteLine(x.Foo); 
    } 
... 
} 

回答

13

它使一個屬性只讀由外部源(即不MyClass和/或它的子類,即類)。或者,如果您將屬性protected聲明爲private set,則該屬性只能由其子類讀取,但可以自行寫入。

這對你的班級沒有什麼影響,因爲你的設置對於那個班級是私人的,所以你的班級仍然可以訪問它。但是,如果您試圖從另一個類實例化MyClass,那麼如果它具有私有或受保護的setter,則無法修改Foo屬性的值。

privateprotected意味着同樣在這裏,因爲他們做到萬無一失:private只限制到非常一流的訪問,同時protected限制訪問該類及其所有派生類。

0
在訪問和mutator方法上(除了你沒有明確寫入方法體出

想到getset功能:

private int foo; 

public int get_Foo() 
{ 
    return foo; 
} 

public /* or protected, or private */ void set_Foo(int value) 
{ 
    foo = value; 
} 

後,你看到它這樣,知道在protectedprivate修飾作用相同的二傳手,因爲他們在任何其他類型的成員做。

1

它的確與衆不同,當你有一個使用繼承的一個類模型。如果你的MyClass的方法是你的私人領域的客戶和方法沒有區別。

即使你不希望你的MyClass成爲任何類層次結構中的父類,它也不會傷害到將你的字段和方法範圍限制到它所需的最不可見的範圍。在默認情況下,使用最不可見的作用域進行封裝,以便在子類開始訪問它們不應該訪問的父屬性時不必重構。努力水平與不這樣做沒有什麼不同。

1

如果您在getset關鍵字上未指定訪問修飾符,則該屬性將根據屬性本身的訪問修飾符進行訪問。在你的例子中,如果你指定了get而不是private get,你將能夠獲得Foo的值並從程序中的任何位置設置Foo的值。

爲了編寫健壯的代碼,您應該嘗試始終選擇最具限制性的訪問修飾符。使用屬性來公開對象的狀態是一個好主意,但不要從外部改變對象的狀態。如果您想更改對象的狀態,請改用方法調用。