空传播算子的性能和编译

时间:2017-12-13 19:35:26

标签: c# intermediate-language

这是我想要重写的一些C#属性。

其中一个原始属性的示例:

public double? PartQuantity
{
    get
    {
        if( MaintenanceRequestPart != null )
            return MaintenanceRequestPart.ReportedQuantity.HasValue
                ? (double?)MaintenanceRequestPart.ReportedQuantity.Value
                : null;

        return null;
    }
}

这将改为:

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity;

注1: MaintenanceRequestPart可以为空

注意2: MaintenanceRequestPart.ReportedQuantity是一个可以为空的双重

这会保存还是添加一些操作/分支/开销?我很好奇这是什么?操作符实际上在转换为中间语言后转换为幕后。

1 个答案:

答案 0 :(得分:4)

这很好。唯一的区别是它会在IL级别上复制此变量的引用。所以这基本意味着:

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity;

与:

相同
public double? PartQuantity 
{
    get
    {
        var value = MaintenanceRequestPart;
        return value == null ? null : value.ReportedQuantity;
    }
}

为什么要进行额外复制?答案非常简单 - 如果从不同的线程访问此值,则捕获原子设备的值。当你处理事件时它非常有用(所以它不会在“?”运算符的中间抛出NullReferenceException):

public event EventHandler OnSomethingHappened;
...
OnSomethingHappened?.Invoke(this, new EventArgs());

但是,不要害怕,它不会对性能产生合理的影响。

判决:您可以在不丢失任何内容的情况下进行重构

相关问题