改寫爲更清晰
是好的產生的磁場,但它是不可見的,你的代碼作爲常規領域。
這裏是典型的自動屬性:
public string FirstName { get; set; }
,如果我們看一下編譯的程序集,產生這種後備存儲領域:
[CompilerGenerated]
private string <FirstName>k__BackingField;
注意<和>在那裏,這是不是您可以在自己的字段名稱中使用的字符。你也不能訪問這個領域,因爲它在編譯器關心的時候並不「存在」,當它看着你的代碼。
真正的問題在這裏,從我這裏是爲什麼你想訪問該字段。換句話說,您爲什麼需要訪問該字段,並且它對您的代碼訪問該屬性沒有做什麼?
如果你想防止外界寫訪問現場,通過使setter方法私有的,這樣是很容易可行:
public string FirstName { get; private set; }
注意,由於該領域是在組裝實際存在,它意味着這不是JITter魔術,而是編譯器魔術,因此您可以使用反射來查找和訪問該字段。
但是,爲什麼你想?
現在,讓我們假設您想要使用該字段而不是屬性確實存在合法的原因。我能想到的一個,雖然我可能會採取不同的方式,這將是您要的字段名稱傳遞給方法作爲out或ref參數,就像這樣:
public void AdjustName(ref String name)
{
name = Capitalize(name);
}
你不能通過屬性OUT/REF參數,所以這段代碼將無法正常工作:
AdjustName(ref string FirstName);
在這種情況下,你需要手動回落到定義屬性的「老」的方式,增加了後備存儲領域,像這樣:
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
有了這個地方,你可以調用方法:
AdjustName(ref string firstName); // note the field, not the property
不過,我可能會改變這種方法,以回報新值,而不是直接調整參考的變量。
請注意,這是C#3.0的一個功能,不是.NET 3.5 - 即使您從C#3.0編譯器定位.NET 2.0,也可以使用它。 – 2009-08-14 10:29:32
可能的重複[是規範中的自動屬性的實現?](http://stackoverflow.com/questions/1171636/is-the-implementation-of-auto-properties-in-the-spec) – nawfal 2013-06-03 18:13:19