我被告知在c#屬性不允許在自動實現的屬性。真的嗎?如果是的話爲什麼自動實現的屬性是否支持屬性?
編輯:我從一本關於LINQ的流行書中獲得了這些信息,並且無法相信它! 編輯:請參閱第34頁LINQ由保羅·金梅爾,他說:偷跑的「屬性不允許在自動實現的屬性,因此推出自己如果你需要一個屬性」
我被告知在c#屬性不允許在自動實現的屬性。真的嗎?如果是的話爲什麼自動實現的屬性是否支持屬性?
編輯:我從一本關於LINQ的流行書中獲得了這些信息,並且無法相信它! 編輯:請參閱第34頁LINQ由保羅·金梅爾,他說:偷跑的「屬性不允許在自動實現的屬性,因此推出自己如果你需要一個屬性」
,以證明這是錯誤的最簡單的方法是隻測試:
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);
}
}
}
我建議你給作者發郵件,這樣他可以發佈它作爲一個勘誤表。如果他的意思是你不能將屬性應用於字段,這將給他一個更仔細解釋的機會。
您可以將屬性自動屬性,而不一個問題。從MSDN
報價:
屬性被允許在 自動實現的屬性,但 顯然不是在背襯領域 因爲這些都不是從 你的源代碼訪問。如果您必須在 屬性的後臺字段上使用 屬性,只需創建一個常規的 屬性。
還要注意,任何自動屬性也會應用CompilerGeneratedAttribute。
我認爲作者的意思是,你不能將自定義屬性應用到私人支持字段。 例如,如果你想標記自動財產爲不可序列化,你不能做到這一點:
[Serializable]
public class MyClass
{
[field:NonSerializedAttribute()]
public int Id
{
get;
private set;
}
}
此代碼編譯,但它不工作。 你可以將屬性本身應用屬性,但你不能適用於後臺領域。
你能說*完全*這些信息是什麼? (我認爲給這本書的名稱和參考是合情合理的)。 – 2009-01-21 11:32:18
習慣相信它 - 在文本和工具中。我們都會犯錯。我記得當天Turbo C++ 1.0編譯器在拷貝構造函數(或其他相關的東西)上有內部內存泄漏。我無法相信這是編譯器的錯,而且在我證明它之前不是源代碼中的錯誤。他們在下一個版本中修復它。 – 2009-12-10 23:46:24