C# 属性访问优化

标签 c# .net optimization compiler-construction

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


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

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


我想,如果编译器能够以某种方式检测到 View 在两次访问之间保持不变,它就可以避免两次计算该值。是否执行了这些类型的优化?

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

相关:关于 (Microsoft) C# 编译器工作原理的任何引用资料?

最佳答案

一般不会,不会。正如 Steven 所提到的,关于多线程有很多因素需要考虑,如果你真的在计算可能会改变的东西,你是对的,它应该从一个属性中重构出来。如果它不会改变,你应该延迟加载它(检查私有(private)成员是否为 null,如果是则计算,然后返回值)。

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

希望对您有所帮助。

关于C# 属性访问优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318009/

相关文章:

c# - 连接到 VPN 后获取结果

c# - 如何使用 LinQ 对特定数量的行进行分组?

c# - 存储最后 N 个击键

php - 生成一百万个唯一的随机 12 位数字

r - 任何用于优化 R 性能的文档?

c# - 来自 WCF 服务的响应对象

c# - Selenium - 'ITimeouts.ImplicitlyWait(TimeSpan)' 已过时

c# - List<T> 实现 IQueryable<T>

.net - 哪里可以找到.NET配置工具?

java - Java 编译器可以优化这段代码吗?