2010-09-09 86 views

回答

4

屬性被用於聲明性編程模型

屬性不會強制使用任何功能(除非開箱即用)。 對於開箱即用的屬性,請閱讀msdn上的文檔。對於你自己的屬性,你需要編寫代碼,如果一個類/方法等有一個屬性。

我不認爲屬性是動態添加的。它們是動態讀取的。 它們是元數據,因此在編譯時添加。檢查此:Can attributes be added dynamically in C#?

自定義屬性是那些你創建和標記你的類與。要創建一個屬性,您需要創建一個從System.Attribute繼承的類(對於屬性)。檢查:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

9
  1. 屬性是爲了增加約一類,功能更多的信息,等等。有時編譯器做特別的事情,當他們看到的屬性。程序運行時,庫的其他屬性會被庫查看。

  2. 首先查看所需功能的文檔。它應該列出哪些屬性是必要的。

  3. 否。屬性只能在代碼編譯之前應用。

  4. 這只是您自己創建的一個屬性,而不是.NET自帶的屬性。

1

屬性用於提供有關類中的類,方法,屬性和事件的元數據。

一些最常用的屬性用於告知設計師有關類中屬性的信息,如BrowsableDescription。這個元數據然後被PropertyGrid使用。屬性的其他示例可能是序列化期間使用的SerializableObsolete屬性或將代碼元素標記爲廢棄。

通過使用[AttributeName(parameter1,...)]語法,可以將屬性添加到類,屬性,方法和事件中。

自定義屬性是指派生自System.Attribute的屬性,它們不是.NET框架中的標準屬性。

3

屬性用於元編程。元編程可幫助您在運行時通過代碼實現活力。假設你的班級中有10個道具,並且你只想讀某些特定的道具,爲此你會對這些道具應用一些特殊的屬性,並且在運行時通過反射你會要求只過濾那些給予特殊道具的道具屬性,然後在這些道具上執行你的工作。這只是一個例子。

在我們的案例中,我們有屬性驅動驗證框架。所以如果想要道具。在將對象保存到數據庫之前不要留空,我們將它標記爲NotNullOrEmpty屬性,並且基類將有一個方法Validate(),它將在將對象保存到數據庫之前調用。 Validate()方法將過濾obj。道具。使用Validatable屬性並在違反驗證的情況下執行驗證並拋出異常。

+0

很好的解釋和例子,我只是有這樣的情況下,現在,所以謝謝! – greenoldman 2010-09-09 06:45:25

6

當你寫你的代碼時,你回答「什麼?」問題:

  1. 該怎麼辦? (方法)
  2. 要存儲什麼? (字段和屬性)
  3. 什麼是什麼? (類層次結構)

等屬性爲此問題添加另一個維度。他們回答「如何?」題。並回答「如何?」問題可能對IDE是重要的,

[Browsable(false)] 
public string NotImportantField { get; set; } // property which will not be displayed in VS 

編譯器

[ThreadStatic] 
private static RequestContext context; // field which will be different for every thread 

或用於經由反射分析你的另一代碼。

[XmlIgnore] 
public string NotSerializableField { get; set; } // property which will not be xml-serialized 

你可能要定義自定義屬性,如果你的組件類,字段,方法等進行分析或通過反射調用(通常是例如與控制容器和方面 - 反轉的情況下,面向對象編程)。這樣的屬性可能(並且通常是唯一的方式)指示調用者或分析器根據這種屬性存在或其屬性而表現不同。

關於你的第一個問題,那麼,我們如何知道哪種方法需要特定的結果?作爲一名.NET開發人員的優勢之一是,一切都被記錄得非常徹底。 :)當你想指定某一種約束到您的編程語句

0

屬性用於:

Exapmple:

[StructLayout(LayoutKind::Sequential)] 
value struct Point 
{ 
public: 
    int x; 
    int y; 
}; 

以上您所定義的結構應該是連續的。

另一個例子是:

[DllImport("user32.dll",CallingConvention=CallingConvention::StdCall)] 

這裏你指定要導入使用的DllImport使用屬性的DLL。我希望你能夠找出屬性的用途。

現在如何知道在什麼時候使用哪些屬性以及哪些功能與您學習函數,委託和事件...相同的時間並使用它。也有很多人可能會爲你回答相同的問題。

0

如果您想要一個非常有用的示例,其中可以使用哪些屬性以及如何執行反射代碼以訪問它們,請檢查Enum ToString。使用代碼,就很容易將ComboBox綁定到枚舉有類型安全的選擇,以及漂亮的人類可讀的描述:

public static void ComboItemsFromEnum<EnumType>(ComboBox combobox) where EnumType : struct 
{ 
    combobox.FormattingEnabled = true; 
    foreach (object enumVal in System.Enum.GetValues(typeof(EnumType))) 
    { 
     combobox.Items.Add(enumVal); 
    } 
    combobox.Format += delegate(object sender, ListControlConvertEventArgs e) 
    { 
     e.Value = GetDescription<EnumType>(e.Value); 
    }; 
} 
相關問題