“属性”到底是什么

本文关键字:是什么 属性 | 更新日期: 2023-09-27 18:32:59

我已经读过很多关于属性的内容,我对它们了解很多。

但我无法理解的一件事是:"它们到底是什么?

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

当您对类或类成员使用和属性时,幕后会发生什么?

我已经阅读了本网站中的其他相关帖子。但他们没有提供太多关于真正发生的事情的信息。它们更多的是关于属性的使用。以及对它们到底是什么的难以理解的解释。在另一篇文章中,这就是声明它们的内容:"元数据。有关对象/方法/属性的数据",这没有阐明概念

“属性”到底是什么

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

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

那么description构造函数参数为 "some text"DescriptionAttribute存储在 IL 中,而不是属性Name .这对每个实例的成本没有影响,并且它本身不执行任何操作。唯一使用此数据的情况是代码显式询问运行时,如下所示:

  • "你对Name还有什么额外的属性元数据?">
  • "NameDescriptionAttribute吗?">
  • "请把存放在Name DescriptionAttribute给我,如果有的话">

然后对结果做一些事情。

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

属性是一个非常简单的概念,但由于框架的许多部分以看似神奇的方式使用它们,因此它们变得复杂。

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

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

可以

实例化属性类,然后可以执行其中的代码,但同样,只有在其他代码请求它时才能执行。 其中大部分代码通常被框架隐藏。 例如,在 MVC 中,有一些属性用于将方法声明为 Post 或 Get 方法...或者必须先对方法进行身份验证,然后才能调用该方法...这些属性之所以有用,是因为 MVC 框架具有用于检查它们并基于它们执行操作的代码。

简而言之,属性本身什么都不做。 它只能与使用它的其他代码(通常在框架中(结合使用。 因此,属性几乎可以是任何人都可以梦想的任何东西。