2009-08-14 34 views
7

我被檢查的.NET 3.5中的新功能創建私有變量的名字,結果發現,在C#3.0中,我們可以使用C#3.0:自動屬性 ​​- 這將是由編譯器

public class Person 
{  
public string FirstName { get; set; } 
public string LastName { get; set; } 
} 

,而不是

private string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

如果我使用自動屬性,名稱的私有變量名稱是什麼?在互聯網上的教程說,編譯器會自動創建一個私有變量。那麼如何使用/訪問私有變量,如果我想在這個類的方法中使用它呢?

+2

請注意,這是C#3.0的一個功能,不是.NET 3.5 - 即使您從C#3.0編譯器定位.NET 2.0,也可以使用它。 – 2009-08-14 10:29:32

+0

可能的重複[是規範中的自動屬性的實現?](http://stackoverflow.com/questions/1171636/is-the-implementation-of-auto-properties-in-the-spec) – nawfal 2013-06-03 18:13:19

回答

17

改寫爲更清晰

是好的產生的磁場,但它是不可見的,你的代碼作爲常規領域。

這裏是典型的自動屬性:

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 

不過,我可能會改變這種方法,以回報新值,而不是直接調整參考的變量。

+0

我想用一個數學計算方法中的屬性值 – Shyju 2009-08-14 10:10:31

+0

那麼爲什麼不直接使用屬性本身? – 2009-08-14 10:10:53

+0

得到的唯一東西是返回特定值;)。 – Dykam 2009-08-14 10:24:38

1

如果您使用自動屬性,則無法訪問專用字段。它不僅是私人的,也是匿名的。

+0

正確。如果你出於任何原因認爲你需要訪問私有成員(其他然後想知道它是什麼「出於好奇」),那麼不要像這樣實現屬性,而是定義你自己的私有成員。像「過去的日子」一樣。 ;-) – peSHIr 2009-08-14 10:21:29

4

如前所述:您無法訪問自動生成的變量(無需使用不好的技巧)。但我認爲你問這個問題是因爲你只想要一個getter,但仍然想要使用自動屬性......對吧?在這種情況下,你可以使用這一個:

public string FirstName { get; private set; } 

現在你有一個私人二傳手和一個公共getter。

0

那麼我如何使用/訪問私有變量,如果我想在這個類的方法中使用它?

在源代碼中,你只需要,並且只允許如果你是個人類中編寫代碼與屬性訪問器person.LastNameLastName工作。

編譯器會自動創建一個私有成員變量或後備字段,但這存在於CIL代碼中。它不存在於你的源代碼中的任何地方。

+0

@Shyju:我想你可能會錯誤地假設Visual Studio會自動生成一個私人字段供你使用。自動生成由編譯器完成,並且僅存在於CIL代碼中。 – 2009-08-14 10:14:46

+0

如果你真的必須得到私人領域,那麼你可以使用反思。但我很確定這不是你想要的, – 2009-08-14 10:16:51