这是我想要重写的一些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
是一个可以为空的双重
这会保存还是添加一些操作/分支/开销?我很好奇这是什么?操作符实际上在转换为中间语言后转换为幕后。
答案 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());
但是,不要害怕,它不会对性能产生合理的影响。
判决:您可以在不丢失任何内容的情况下进行重构