2009-05-01 101 views
7

我想我一直在使用這些術語可互換/錯誤!在C#屬性和實例變量有什麼區別?

public class ClassName 
{ 
    private string variable; 

    public string property 
    { 
     get{ return variable; } 
     set { variable = value; } 
    } 
} 

回答

17

伊恩做

+1

+1:絕對是語言相關的。 – Powerlord 2009-05-01 13:41:38

2

代碼示例,這基本上是一個術語問題是,儘管這個問題,非常語言/環境相關的相關的「語言無關」的標籤。

對於設計討論的緣故,屬性和實例變量可以互換使用,因爲想法是屬性是描述對象的數據項。

當談到一種特定的語言時,這兩個可以是不同的。例如,在C#中,屬性實際上是一個返回對象的函數,而實例變量是類的非靜態成員變量。

0

除了C#語言之外,一個屬性本質上是一個get和set函數。因此,除了獲取/設置之外,它還可以具有自定義邏輯。一個實例變量不能做到這一點。

1

也許這是因爲你第一次來自C++吧?! 在我上學的日子裏,我有教授說,班級屬性或班級一直都是屬性的。自從我轉到Java C#世界後,我開始聽到有關成員的消息。班級成員,實例成員...

然後屬性apear!在Java和.NET中。所以我認爲你最好稱它爲會員。他們是實例成員(或稱爲實例變量)或類成員....

乾杯!

1

屬性可以,我想大多數情況下,返回一個實例變量,但它可以做更多。你可以把邏輯放在一個屬性中,聚合值或更新其他實例變量等。我認爲最好避免這樣做。邏輯應該進入方法。

0

屬性是某種與對象關聯的數據。例如,一個圓的屬性是它的直徑,另一個是它的面積。

實例變量是存儲在對象中的一段數據。它不一定需要直接與財產相對應。例如(heh),圓圈可以將其半徑存儲在實例變量中,並根據該半徑計算其直徑和麪積。所有三個仍然是屬性,但只有半徑存儲在一個實例變量中。

一些語言具有「頭等」屬性的概念。這意味着對於客戶端應用程序來說,該屬性看起來像使用實例變量一樣使用。也就是說,不要寫如circle.getDiameter()之類的東西,而是寫circle.diameter,而不是circle.setRadius(5),你會寫circle.radius = 5

3

赫爾希是正確的關於這是特定的語言。但要添加語言特定的答案:

在python中,實例變量是實例的屬性,(通常)是實例字典中引用的內容。這與Java中的成員或實例變量類似,只是所有內容都是公開的。

屬性是獲取器/設置器方法的快捷方式,看起來就像實例變量。因此,在下面的類定義(修改從圭的new style object manifesto):

class C(object): 

    def __init__(self): 
     self.y = 0 

    def getx(self): 
     if self.y < 0: return 0 
     else: return self.y 

    def setx(self, x): 
     self.y = x 

    x = property(getx, setx) 

>>> z = C() 
>>> z.x = -3 
>>> print z.x 
0 
>>> print z.y 
-3 
>>> z.x = 5 
>>> print z.x 
5 
>>> print z.y 
5 

yz實例變量,x是一個屬性。 (一般來說,在定義屬性的地方,有一些技巧用於遮蔽關聯的實例變量,以便其他代碼不直接訪問它)。python中的屬性的好處是設計者不必四處走動先發制人地封裝所有實例變量,因爲未來通過將實例變量轉換爲屬性進行封裝不應該破壞任何現有代碼(除非代碼利用了封裝試圖修復的漏洞,或者依賴於類檢查或其他元數據 - 編程技術)。

所有這一切都是一個很長的回答,說在設計層面上,談論屬性是很好的。關於你可能需要執行什麼類型的封裝是不可知的。我想這個原則不是語言不可知的,但是適用於python旁邊的語言。

0

與給出的其他答案相反,我認爲認爲在語言不可知的成員變量和屬性之間存在有用的區別。

這種區分在面向組件的編程中最爲明顯,它在任何地方都很有用,但在圖形用戶界面中最容易理解。在這種情況下,我傾向於將組件的設計時配置視爲操縱對象的「屬性」。例如,我通過設置其屬性來選擇前景和背景顏色,邊框樣式以及文本輸入字段的字體。雖然這些屬性可能在運行時更改,但它們通常不是。在運行時,代表字段內容的一組不同的變量更有可能被讀取和寫入。我認爲這些信息是組件的「狀態」。

這個區別爲什麼有用?當創建一個佈線組件的抽象時,通常只需要暴露「狀態」變量。回到文本字段示例,您可能會聲明一個接口來提供對當前內容的訪問。但是,控制組件外觀的「屬性」僅在具體的實現類中定義。

2

在目標c中,屬性是一個實例變量,它可以利用重載的點運算符來調用它的setter和getter。所以my.food =「cheeseburger」實際上被解釋爲[我的setFood:「芝士漢堡」]。這是定義絕對不是語言不可知的另一種情況,因爲objective-c定義了@property關鍵字。

相關問題