2012-04-24 88 views
7

考慮下面的代碼:這種訪問修飾符的方法的目的是什麼?

private string _text = null; 
    private string[] _values = null; 

    public string Text { get { return _text; } } 
    public string[] Values { get { return _values; } } 

是什麼成就,僅僅具有public成員不會?

+7

請注意,在將數組作爲類的只讀屬性公開時,應該非常非常小心。 **數組引用是隻讀的,但是數組內容不是。**這個類的用戶可以隨意改變數組的內容。如果不需要,則返回一個'ReadOnlyCollection ',而不是'string []'。 – 2012-04-24 18:52:43

+1

Eric對此主題的詳細想法:http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx – SolutionYogi 2012-04-24 19:21:44

回答

10

通過使用屬性而不是公用字段,可以隱藏實現。

如果在某些時候需要更改文本和值屬性的返回值,則可以在不更改該類的API的情況下更改行爲。

此外,此習語限制外部訪問公開數據爲只讀。

+2

轉載了只讀訪問的問題,希望這不太模糊。感謝@AdamHouldsworth! – 2012-04-24 16:12:16

5

此代碼將允許外部實體讀取您的值,而您的代碼可以在內部修改後臺字段。

可以簡寫,使用自動屬性:

public string Text { get; private set; } 
public string[] Values { get; private set; } 

隨着公共領域,你將無法防止外部修改,並支持在同一時間內修改。

即使您想將字段公開爲外部可寫,我仍然會建議將該東西封裝在屬性中 - 您永遠不知道是否需要在內部支持某些內容而不破壞外部契約(set/get中的自定義代碼爲您提供空間來做到這一點)。

更不用說大多數數據綁定框架沒有看到字段,只有屬性。

2

_text_values只能在它們定義的類中設置,但它們的值可以通過屬性訪問。

6

這是讓值只讀的,但我更傾向於把它寫這樣的:

public string Text { get; private set;} 
public string[] Values { get; private set; } 
+3

這隻會使值僅讀取到課程外。 – 2012-04-24 16:04:38

+0

@AdamHouldsworth我不反對。 – asawyer 2012-04-24 16:05:14

+2

只是澄清,因爲像readonly周圍扔單詞可能會與'readonly'關鍵字混淆。 – 2012-04-24 16:06:01

2

在你的榜樣其作爲只讀使得性能,但也有其他用途。

public string Text { get { return _text; } } 

如果你想在內部做了一些return_text操作,然後對proeperty返回它Text你可以像。

public string Text { get { return _text.ToUpper(); } } 

這是場Encapsulation

封裝有時被稱爲第一支柱或面向對象編程的 原理。根據封裝的原理 ,一個類或結構可以指定其成員的每個成員在類或結構外編碼的可訪問性。方法和 變量不打算從類別 或程序集外使用,可以隱藏以限制編碼錯誤或惡意漏洞利用的可能性。

請看下面的例子:

// private field 
    private DateTime date; 


    // Public property exposes date field safely. 
    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
     set 
     { 
      // Set some reasonable boundaries for likely birth dates. 
      if (value.Year > 1900 && value.Year <= DateTime.Today.Year) 
      { 
       date = value; 
      } 
      else 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 

在這個例子中是通過財產Date公開曝光的私人領域date。現在,如果您想爲日期設置邊界,則可以看到屬性的設置部分。

相關問題