当属性注释类型/方法/属性时,编译器/ CLR实际上在做什么?

时间:2011-03-04 20:05:35

标签: .net attributes

当您使用属性注释类型或方法或属性时,编译器/ CLR /等是什么。为你做什么?

我的猜测是它是“注入”方法,属性等等到你的类定义(或者只是进入你的对象?或?)并提供自动行为,有点像当您使用简洁声明委托时:

public delegate void MySuperSpecialDelegate(myAwesomeClass myAwesomeObject);

然后你会得到一些非常棒的自动行为,它会被“注入”编译代码(CIL)中。

重申一下这个问题,当您使用属性时,“幕后”会自动发生什么?

2 个答案:

答案 0 :(得分:3)

绝对没有,只有一些非常的具体示例:

  • PrincipalPermissionAttribute
  • MethodImplAttribute

有一些非常具体的处理

除此之外,属性是惰性的,只有在明确使用反射时才会激活。

编译器使用了一些,但是 - ConditionalAttribute,SerializableAttribute等。

但重申一下,在一般情况下和绝大多数属性:没有,nil,zip,nada nix和null。

答案 1 :(得分:2)

取决于属性。

“{3}}等”常规“属性在运行时不会执行任何操作(除非您尝试读取它们,在这种情况下它们会被实例化);它们只是描述数据/代码的元数据,编译器和/或调试器有时会使用它来帮助程序员。

“特殊”属性很特别。它们可以更改代码中的标志,导致CLR行为以某种方式更改,或导致其他一些可观察到的更改;它依赖于属性。 (例如CLSCompliantAttribute会导致字段布局发生变化,这显然是一种可观察到的运行时效果。)

使用FieldOffsetAttribute可以看到行为更改的 extreme 示例,在这种情况下,您几乎可以劫持类的整个代码(甚至是构造函数)。

此类“特殊”属性的其他示例包括InAttributeOutAttributeThreadStaticAttributeMTAThreadAttributeTypeForwardedToAttribute(我认为),ComImportAttributeDllImportAttribute等等......实际上有很多这些!