![]() |
1
2
在通过in Reflector调用GetCustomAttributes的示例之后,代码的托管部分(即它转换到运行时并成为外部调用的点)在CustomAttribute.GetCustomAttributes中处于关闭状态。
将调用默认值
会调用一个
我看不到任何证据表明实例的缓存是执行的,这意味着属性实例在被反射时是按需创建的。
前面提到的托管运行时转换发生在CustomAttribute.\u CreateCaObject。虽然不容易静态分析此方法是否确实缓存了它创建的实例(它可能以内存缓冲区指针的形式获得足够的状态信息,可能指示属性声明所在的元数据位置),但我们可以查看以下事实:
这告诉我属性总是构造的。 当然,我们可以通过在测试中编写一段代码来测试这一点。
因此,元数据属性的有效使用是将它们缓存在用户代码中,当然,除非该属性在某种程度上是可变的,这使得它不适用于给定对象的所有实例
因此,在此之后,一旦代码中对它的所有引用都为空,GC就可以使用一个属性。对于该属性的所有成员也是如此。 因此,一个使用GetCustomAttributes()检索属性、使用它然后丢弃引用的方法刚刚发布了该属性的一个新实例,以便GC在需要时进行清理。 因此-属性实例受与所有类实例完全相同的内存管理和生存期规则的控制;因此@PieterG在他的回答中所说的是正确的——在所有对该属性的引用被释放之后,可以随时调用析构函数。 |
![]() |
2
1
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 7 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 7 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 7 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 8 月前 |