2009-01-21 125 views
5

我被告知在c#屬性不允許在自動實現的屬性。真的嗎?如果是的話爲什麼自動實現的屬性是否支持屬性?

編輯:我從一本關於LINQ的流行書中獲得了這些信息,並且無法相信它! 編輯:請參閱第34頁LINQ由保羅·金梅爾,他說:偷跑的「屬性不允許在自動實現的屬性,因此推出自己如果你需要一個屬性

+0

你能說*完全*這些信息是什麼? (我認爲給這本書的名稱和參考是合情合理的)。 – 2009-01-21 11:32:18

+0

習慣相信它 - 在文本和工具中。我們都會犯錯。我記得當天Turbo C++ 1.0編譯器在拷貝構造函數(或其他相關的東西)上有內部內存泄漏。我無法相信這是編譯器的錯,而且在我證明它之前不是源代碼中的錯誤。他們在下一個版本中修復它。 – 2009-12-10 23:46:24

回答

7

,以證明這是錯誤的最簡單的方法是隻測試:

using System; 
using System.ComponentModel; 
using System.Reflection; 

class Test 
{ 
    [Description("Auto-implemented property")] 
    public static string Foo { get; set; } 

    static void Main(string[] args) 
    { 
     var property = typeof(Test).GetProperty("Foo"); 
     var attributes = property.GetCustomAttributes 
       (typeof(DescriptionAttribute), false); 

     foreach (DescriptionAttribute description in attributes) 
     { 
      Console.WriteLine(description.Description); 
     } 
    } 
} 

我建議你給作者發郵件,這樣他可以發佈它作爲一個勘誤表。如果他的意思是你不能將屬性應用於字段,這將給他一個更仔細解釋的機會。

12

您可以將屬性自動屬性,而不一個問題。從MSDN

報價:

屬性被允許在 自動實現的屬性,但 顯然不是在背襯領域 因爲這些都不是從 你的源代碼訪問。如果您必須在 屬性的後臺字段上使用 屬性,只需創建一個常規的 屬性。

1

還要注意,任何自動屬性也會應用CompilerGeneratedAttribute。

3

我認爲作者的意思是,你不能將自定義屬性應用到私人支持字段。 例如,如果你想標記自動財產爲不可序列化,你不能做到這一點:

[Serializable] 
public class MyClass 
{ 
    [field:NonSerializedAttribute()] 
    public int Id 
    { 
     get; 
     private set; 
    } 
} 

此代碼編譯,但它不工作。 你可以將屬性本身應用屬性,但你不能適用於後臺領域。