C#属性访问优化

Tri*_*ock 2 .net c# compiler-construction optimization

在C#(或VB .NET)中,编译器是否尝试优化属性访问?例如,


public ViewClass View
{
    get
    {
        ...
        Something is computed here
        ....
    }
}

if (View != null)
    View.Something = SomethingElse;


我想如果编译器可以某种方式检测到View两次访问之间保持不变,它可以避免计算两次值.是否进行了这些优化?

我知道如果View有一些密集的计算,它可能应该重构为一个函数(GetView()).在我的特定情况下,View涉及攀爬视觉树寻找特定类型的元素.

相关:关于(Microsoft)C#编译器的工作原理的任何参考?

Kie*_*one 5

不一般,没有.正如史蒂文所提到的,关于多线程有许多因素需要考虑,如果你真的在计算可能会改变的东西,那么你是正确的,它应该被重构而不是属性.如果它不会改变,你应该延迟加载它(检查私有成员是否为null,如果是,则计算,然后返回值).

如果它不会改变并依赖于参数,则可以使用DictionaryHashtable作为缓存 - 给定参数(键),您将存储该值.您可以将每个条目作为WeakReference值的值,因此当值未在任何地方引用并且垃圾收集发生时,将释放内存.

希望有所帮助.