0

这特指我要重写的一些 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是一个可以为空的双精度

这会保存或添加一些操作/分支/开销吗?我很好奇是什么?。运算符一旦变成中间语言,实际上就会在幕后翻译。

4

1 回答 1

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());

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

结论:您可以在不丢失任何东西的情况下进行此重构

于 2017-12-13T19:47:04.007 回答