[英]Are C# properties actually Methods?
直到現在,我認為Properties
和Methods
是C#中的兩個不同的東西。 但后來我做了類似下面的事情。
這對我來說是一個“眼睛開啟者”。 我期待一個屬性stringProp
和一個方法stringProp
但我得到了這個。
為什么會這樣? 請有人解釋一下。
是的,編譯器為屬性生成一對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的“ 為什么屬性重要” 。
嚴格地說,屬性不是方法,雖然他們確實通過getter和setter方法(也稱為存取)的支持。 當您編寫這樣的代碼時(假設您修改代碼以刪除下面提到的編譯錯誤)
myFoo.stringProp = "bar";
編譯器實際生成IL代碼,如下所示:
ldstr "bar"
callvirt foo.set_stringProp
其中set_stringProp
是該屬性的setter方法。 實際上,如果您願意,可以直接通過反射調用這些方法。
但是,您發布的代碼示例在Visual Studio的intellisense中可能看起來不錯,但它不會編譯。 嘗試構建項目,您將看到如下錯誤:
'foo'類型已包含'stringProp'的定義
這是視覺工作室的內容問題,可以通過名字選擇 。 順便說一句,由於同一類型的名稱沖突,您的代碼甚至無法編譯。
但你是對的,最后的屬性是方法:
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
(property)
是。 屬性是mutator
方法。
在計算機科學中,mutator方法是用於控制變量變化的方法。 它們也被廣泛稱為setter方法。 通常,setter附帶一個getter(也稱為accessor),它返回私有成員變量的值。
mutator方法最常用於面向對象的編程,與封裝原理保持一致。 根據這個原則,類的成員變量是私有的,以隱藏和保護它們免受其他代碼的攻擊,並且只能通過公共成員函數(mutator方法)修改,該函數將所需的新值作為參數,可選地驗證它,並修改私有成員變量。
Mutator方法也可用於非面向對象的環境中。 在這種情況下,對要修改的變量的引用將與新值一起傳遞給mutator。 在這種情況下,編譯器不能限制代碼繞過mutator方法並直接更改變量。 開發人員有責任確保變量僅通過mutator方法修改而不是直接修改。
在支持它們的編程語言中,屬性提供了一種方便的替代方案,而不會放棄封裝的實用性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.