我已经阅读了很多关于属性的内容,而且我对它们了解得非常多。
但我能理解的一件事是:"他们到底是什么?"。
我的意思是,如果这不是继承或接口实现或其他OOP可理解的概念,那么这是什么概念?
当您为类或类成员使用和属性时,场景背后会发生什么?
我已阅读本网站的其他相关帖子。但他们并没有提供有关实际情况的大量信息。它们更多地是关于属性的使用。并且对于它们到底是什么还有一种难以理解的解释。在另一篇文章中,这就是声明它们的原因:"元数据。有关您的对象/方法/属性的数据。"这并没有澄清概念
答案 0 :(得分:2)
它们只是存储在该类型的基础定义(非实例)中的元数据。例如,如果我这样做:
[Description("some text")]
public string Name {get;set;}
然后,DescriptionAttribute
description
构造函数参数"some text"
的事实存储在IL中,而不是Name
。这对每个实例的成本没有影响,并且它本身 nothing 。这个数据的唯一使用时间是代码显式地向运行时询问:
Name
提供了哪些其他属性元数据?”Name
有DescriptionAttribute
吗?”DescriptionAttribute
存储的Name
,如果一个”然后对结果做一些事情。
CAVEAT :某些属性由编译器和/或CLI以不同方式处理,并以不同方式实现。例如,[Serializable]
成为IL类型标志 - 而不是IL属性 - 但运行时会将其填充,以便API将其报告为另一个。
答案 1 :(得分:1)
属性是一个非常简单的概念,但它们很复杂,因为框架的这么多部分以看似神奇的方式使用它们。
属性只不过是元数据。也就是说,它们本质上是框架可以在运行时读取的注释,用于描述类型的内容。有各种各样的属性可用于各种目的,并且编写了各种代码来查找这些属性。
属性本身不做任何事情。他们需要一些其他代码来阅读它们,然后根据它们找到的内容做一些事情。
可以实例化属性类,然后可以执行它们中的代码,但同样,只有当其他代码请求它时。这些代码中的大部分通常都被框架隐藏。例如,在MVC中,有一些属性用于将方法声明为Post或Get方法......或者在调用方法之前必须对方法进行身份验证...这些属性仅有用,因为MVC框架具有要检查的代码他们,并根据他们采取行动。
简而言之,属性本身不起作用。它只与使用它的其他代码(通常在框架中)一起使用。因此,属性几乎可以是任何人都可以想到的任何东西。