C#属性属性

TK.*_*TK. 14 c# attributes properties

我看过以下代码:

[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...} 
Run Code Online (Sandbox Code Playgroud)

上面的snippit的功能似乎很清楚,我不知道如何使用它来做有用的事情.我甚至不确定给它的名字!

有谁知道我在哪里可以找到有关这些属性属性的更多信息/教程?我也对这个功能可以做的任何新颖/有用的任务感兴趣.

Jam*_*ran 27

上面的snippit的功能看起来很清楚,

也许不是,因为许多人认为[DefaultValue()] 设置了属性的值.实际上,它只是告诉一些视觉设计师(例如Visual Studio),代码将默认值设置为什么.这样它就知道如果将其设置为其他内容,则在属性窗口中加粗值.

  • 没有!如果未将MyProperty显式设置为某个值,则默认为0(假设为后备存储).表单设计器将值显示为"0",但加粗,表示从默认值手动更改.如果只影响表单设计器中的值的外观. (3认同)

Mar*_*ell 13

人们已经涵盖了UI方面 - 属性有其他用途,但是......例如,它们在大多数序列化框架中被广泛使用.编译器对某些属性进行了特殊处理 - 例如,[PrincipalPermission(...)]向方法添加声明性安全性,允许您(自动)检查用户是否具有适当的访问权限.

要添加自己的特殊处理,可以使用PostSharp ; 有许多使用PostSharp来执行AOP操作的很好的例子,例如日志记录 - 或者只是代码简化,例如自动INotifyPropertyChanged实现.


Grz*_*nio 7

它们被称为属性,msdn中有很多信息,例如http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

一般来说,他们不会自己"做"任何事情,它们会被其他一些使用你的类的代码所使用.XmlSerialization是一个很好的例子:XmlSerializer(由Microsoft作为框架的一部分提供)几乎可以是任何类(虽然在类上有许多要求) - 它使用反射来查看类中包含的数据.您可以使用属性(与XmlSerializer一起定义)来更改XmlSerializer序列化类的方式(例如,告诉它将数据保存为属性而不是元素).


Isa*_*avo 6

您的示例中的那些由可视化设计器(即MS Expression Blend和Visual Studio设计器)使用,以在设计器UI中提供提示.

请注意,它们是元数据,不会影响属性逻辑.DefaultValue例如,设置实例不会将属性设置为默认值,您必须手动执行此操作.

如果由于某种原因想要访问这些属性,则必须使用反射.

有关设计器属性的更多信息,请参阅MSDN.