2014-04-16 75 views
73

到目前爲止,我的印象是Properties & Methods是C#中的兩個不同的東西。但後來我做了如下的事情。C#屬性實際上是方法嗎?

enter image description here

,這是一個 「大開眼界」 給我。我期待一個物業stringProp和一個方法stringProp,但我相反,我得到了這一點。

爲什麼發生這種情況?請有人解釋一下。

+4

這不是真的清楚你要找的內容作爲一個答案。但[屬性](http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx)說:「...他們實際上是稱爲訪問器的特殊方法。」 –

+3

http://en.wikipedia.org/wiki/Syntactic_sugar – ComethTheNerd

+30

擁有同名的屬性和方法是不合法的,所以我並不感到驚訝Intellisense感到困惑。 –

回答

104

是的,編譯器爲一個屬性生成一對get和set方法,加上一個自動實現的屬性的私有後臺字段。

public int Age {get; set;} 

成爲相當於:訪問你的財產

private int <Age>k__BackingField; 

public int get_Age() 
{ 
    return <Age>k__BackingField; 
} 

public void set_Age(int age) 
{ 
    <Age>k__BackingField = age; 
} 

代碼將被編譯爲調用這兩個方法之一。這正是將公共領域變爲公共財產的原因之一,是一個突破性的變化。

查看Jon Skeet的Why Properties Matter

+10

奇怪的是,代碼中的''是什麼? – ca9163d9

+29

@ dc7a9163d9其實,' k__BackingField'是該字段的名稱。儘管這是C#中的非法名稱,但它在IL(中級語言)中是完全有效的名稱。這是爲聲明該字段而生成的IL:'.field private int32' k__BackingField''。大多數編譯器生成的類型(如lambda閉包和枚舉器)都在其名稱中包含'<>'。 – dcastro

16

這是視覺工作室intelicence問題,該名稱挑選名稱。順便說一句,你的代碼甚至不會編譯,因爲相同類型的名稱衝突。

但你是對的,那性質方法結尾:

public class A { 

    public string Name {get;set;} 
} 

這裏Name財產轉換成2種方法:get_Name()set_Name()

事實上,如果你像這樣定義類:

public class A { 

    public string Name {get;set;} 

    public string get_Name() { 
     return "aaa"; 
    } 
} 

你會得到編譯錯誤,因爲已經定義get_Name(財產)

24

嚴格地說,屬性不是方法,雖然他們的確是確實由getter和setter方法(也稱爲訪問器)支持。當編寫這樣的代碼(提供修改代碼,以除去下文提到的編譯錯誤)

myFoo.stringProp = "bar"; 

編譯器實際上產生IL這樣的代碼:

ldstr  "bar" 
callvirt foo.set_stringProp 

哪裏set_stringProp爲setter方法該財產。事實上,如果你願意,你可以通過反射直接調用這些方法。

但是,您發佈的代碼示例在Visual Studio的智能感知中可能看起來不錯,但它不會編譯。嘗試建設項目,你會看到這樣的錯誤:

類型「富」已經包含了一個定義,「stringProp」

+2

最大的不同之處在於,屬性可以通過可能不適用於方法的屬性具有其他關聯的元數據。 –

-1

是。屬性是mutator方法。

在計算機科學中,增變器方法是一種用於控制變量變化的方法。他們也被廣泛稱爲二傳手方法。一個setter通常伴隨一個getter(也稱爲訪問器),它返回私有成員變量的值。

mutator方法最常用於面向對象的編程,符合封裝原則。根據這個原則,一個類的成員變量被隱藏起來以隱藏並保護它們免受其他代碼的影響,並且只能通過一個公共成員函數(mutator方法)進行修改,該函數將所需的新值作爲參數,可選地驗證它並修改私有成員變量。

Mutator方法也可用於非面向對象的環境。在這種情況下,將要修改的變量的引用與新值一起傳遞給增變器。在這種情況下,編譯器不能限制代碼繞過mutator方法並直接更改變量。這個責任落在了開發者身上,以確保變量只能通過mutator方法修改,而不能直接修改。

在支持它們的編程語言中,屬性提供了一個方便的選擇,而不會放棄封裝的效用。

參考:http://en.wikipedia.org/wiki/Mutator_method

相關問題