2013-03-24 61 views
0

在我所有的研究中,我都瞭解到,當我想讓用戶訪問內部屬性時,我不應該直接訪問該屬性,而是通過get/set方法給出訪問權限,例如:我應該公開我的類的屬性嗎?

class myClass 
{ 
    private int x; 

    public void SetX (int x) 
    { 
     this.x = x; 
    } 

    public int GetX() 
    { 
     return this.x 
    } 
} 

因爲它提供了允許程序員徹底更容易地改變發動機在不影響用戶,更容易去竊聽的額外的好處,並給出了檢查輸入的有效性更多的選擇。但是,自從我開始在C#中學習和編寫代碼之後,我注意到大多數語言的「本機」類都暴露了它們的屬性,例如設置/獲取矩形的位置或大小(System.Drawing.Rectangle) ,您可以直接訪問X,Y,WidthHeight屬性。

  • 我看到暴露屬性的唯一好處是代碼有點簡單。是否有任何其他好處揭露物業?

  • 當我應該公開的屬性,什麼時候應該不是我?

+3

[閱讀本文](http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html)。閱讀評論也 – 2013-03-24 14:41:56

+0

@ManishMishra我打算寫一些答案,但後來我讀了您的評論,感謝您的鏈接 – Vamsi 2013-03-24 14:50:02

+0

@ManishMishra,您的鏈接是偉大的,發佈它作爲一個答案(總結什麼是寫在那裏)我會接受它。 – SIMEL 2013-03-25 07:10:47

回答

1

所以基本上,你的問題是性能相公共變量。何時使用什麼?

閱讀this Post,包括註釋。

整個討論的快速摘要:

  • 思考的工作方式不同的變量與屬性,所以如果依靠反射,
    它更容易使用的所有屬性。
  • 你不能對數據綁定變量。
  • 更改爲屬性變量是一個重大更改。

瑣碎的屬性實現暴露數據成員是沒有或很少增益和大量的代碼唯一合理的原因可能是:

  • 提供只讀成員訪問var不了的由於某種原因而被聲明爲const

  • 如果您正在編寫一個組件供某些第三方使用,並且存在任何組件必須被替換而不需要這些用戶重建(更改公共成員變量屬性打破了整數erface,所以需要重建)。

而且,包裹公共領域的性質,原因有兩個 - 一個是,你不能在不破壞二進制兼容性進行更改。二是你不能綁定到領域。

Reflection code against fields looks very different from reflection code against 
properties (FieldInfo vs. PropertyInfo for starters). So even if you can 
recompile against the new binary, if you use reflection on that field 
you're hosed. 
0

在C#中使用屬性而不是getter/setter方法,因爲它們提供了相同的功能。請注意,字段!=屬性。見MSDN: Properties

0

就像你說的,不是給你的變量直接訪問的好處是,你可以改變執行不爲你的類的用戶進行任何更改。而在面向對象的編程方面,我認爲這是一件重要的事情。

此外,通過使用屬性,你仍然可以影響的「GET」或「set」的工作。這在某些情況下可能有用。

2

你混淆屬性和字段。在C#中,屬性可以像公共字段一樣使用,但在內部調用它們的get/set方法。舉個例子,有一個屬性類是這樣的:

class MyClass 
{ 
    // Field, direct access to the internal representation 
    private int x; 

    // Property, access via methods, but syntax like field access 
    public int X { 
     get { return this.x; } // generates a get-method "int get_X()" 
     set { this.x = value; } // generates a set-method "void set_X(int value)" 
    } 
} 

現在,當您設置屬性X這樣的:myClass.X = 42,編譯器將這種以myClass.set_X(42),這就要求在聲明的方法set塊。 Field-like語法只是爲了方便。

所以你應該更喜歡暴露set/get-methods。這只是在C#中,這樣做的首選方法是通過屬性,它將這些方法的實際調用抽象出來,並允許您像字段一樣使用它們。