“属性”究竟是什么?

时间:2014-12-04 08:14:05

标签: c# .net vb.net attributes

我已经阅读了很多关于属性的内容,而且我对它们了解得非常多。

但我能理解的一件事是:"他们到底是什么?"。

我的意思是,如果这不是继承或接口实现或其他OOP可理解的概念,那么这是什么概念?

当您为类或类成员使用和属性时,场景背后会发生什么?

我已阅读本网站的其他相关帖子。但他们并没有提供有关实际情况的大量信息。它们更多地是关于属性的使用。并且对于它们到底是什么还有一种难以理解的解释。在另一篇文章中,这就是声明它们的原因:"元数据。有关您的对象/方法/属性的数据。"这并没有澄清概念

2 个答案:

答案 0 :(得分:2)

它们只是存储在该类型的基础定义(非实例)中的元数据。例如,如果我这样做:

[Description("some text")]
public string Name {get;set;}

然后,DescriptionAttribute description构造函数参数"some text"的事实存储在IL中,而不是Name。这对每个实例的成本没有影响,并且它本身 nothing 。这个数据的唯一使用时间是代码显式地向运行时询问:

  • “您对Name提供了哪些其他属性元数据?”
  • NameDescriptionAttribute吗?”
  • “请构建我DescriptionAttribute存储的Name,如果一个”

然后对结果做一些事情。

CAVEAT 某些属性由编译器和/或CLI以不同方式处理,并以不同方式实现。例如,[Serializable]成为IL类型标志 - 而不是IL属性 - 但运行时会将其填充,以便API将其报告为另一个。

答案 1 :(得分:1)

属性是一个非常简单的概念,但它们很复杂,因为框架的这么多部分以看似神奇的方式使用它们。

属性只不过是元数据。也就是说,它们本质上是框架可以在运行时读取的注释,用于描述类型的内容。有各种各样的属性可用于各种目的,并且编写了各种代码来查找这些属性。

属性本身不做任何事情。他们需要一些其他代码来阅读它们,然后根据它们找到的内容做一些事情。

可以实例化属性类,然后可以执行它们中的代码,但同样,只有当其他代码请求它时。这些代码中的大部分通常都被框架隐藏。例如,在MVC中,有一些属性用于将方法声明为Post或Get方法......或者在调用方法之前必须对方法进行身份验证...这些属性仅有用,因为MVC框架具有要检查的代码他们,并根据他们采取行动。

简而言之,属性本身不起作用。它只与使用它的其他代码(通常在框架中)一起使用。因此,属性几乎可以是任何人都可以想到的任何东西。