C#中属性的目的是什么?
我如何知道哪个属性必须用于特定功能?
如何在c#中动态添加它们?
什么是自定义属性?
答案 0 :(得分:10)
属性用于添加有关类,函数等的其他信息。编译器在查看属性时有时会执行特殊操作。程序运行时,库会查看其他属性。
首先查看文档以了解所需的功能。它应列出必要的属性。
没有。只能在编译代码之前应用属性。
这只是您自己创建的一个属性,而不是.NET附带的属性。
答案 1 :(得分:7)
当你编写代码时,你会回答“什么?”问题:
等。属性为此问题添加了另一个维度。他们回答“怎么样?”题。并回复“如何?”问题可能对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开发人员的一个优点是,所有内容都记录得非常彻底。 :)
答案 2 :(得分:4)
属性用于声明性编程模型。
属性不强制执行任何功能(除非开箱即用)。 对于开箱即用的属性,请阅读msdn 上的文档。对于您自己的属性,您需要编写有关类/方法等具有属性的代码。
我不认为属性是动态添加的。它们是动态阅读的。 它们是元数据,因此在编译时添加。检查一下:Can attributes be added dynamically in C#?
自定义属性是您使用创建和标记类的属性。要创建属性,您需要创建一个继承自System.Attribute的类(对于该属性)。检查一下:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx
答案 3 :(得分:3)
属性用于元编程。元编程可帮助您在运行时使用代码实现动态。假设你的班级有10个道具,你想要因某些原因只读一些特定的道具,为此你会对这些道具应用一些特殊的属性,在运行时,通过反射,你会要求只过滤那些具有给定特殊的道具。属性,然后在这些道具上执行你的工作。这只是一个例子。
在我们的例子中,我们有属性驱动的验证框架。所以,如果想要一个道具。在将对象保存到数据库之前不要保留为空,我们将其标记为NotNullOrEmpty属性,并且基类将具有一个方法Validate(),该方法将在将对象保存到数据库之前调用。 Validate()方法将过滤obj。道具。使用Validatable属性并执行验证并在违反情况下抛出异常。
答案 4 :(得分:1)
属性用于提供有关类中的元数据以及类中的方法,属性和事件。
一些最常见的属性用于告诉Designer有关类中属性的信息,例如Browsable
和Description
。然后,PropertyGrid使用此元数据。其他属性示例包括序列化期间使用的Serializable
或Obsolete
属性,或将代码元素标记为过时。
您可以使用[AttributeName(parameter1,...)]语法向类,属性,方法和事件添加属性。
自定义属性是指从System.Attribute派生的属性,这些属性不是.NET框架中的标准属性。
答案 5 :(得分:1)
设置诸如DEBUG,DEV,STAGING,PROD,Etc之类的不同环境时,经常使用属性。
[Conditional("DEBUG")]
private void OutputDebugInfo()
{
WriteLine("***DEBUG MODE ***");
}
答案 6 :(得分:0)
当您想为编程语句指定某种约束时,使用属性:
Exapmple:
[StructLayout(LayoutKind::Sequential)]
value struct Point
{
public:
int x;
int y;
};
上面你定义了结构应该是顺序结构。
另一个例子是:
[DllImport("user32.dll",CallingConvention=CallingConvention::StdCall)]
在这里,您指定使用DLLImport通过使用属性导入dll。我希望你能找出属性的目的是什么。
现在如何知道使用哪些属性以及哪些功能与您学习函数,代理和事件的方式相同...随着时间的推移和使用它。也许很多人可能会为你回答同样的问题。
答案 7 :(得分: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);
};
}