分配前检查空
本文关键字:检查 分配 | 更新日期: 2023-09-27 18:30:43
有没有办法在不使用if
语句的情况下在赋值操作之前检查null
?有没有办法在一行中提供以下功能,类似于空合并运算符(??
)或扩展方法:
if(myVar != null){ obj = myVar;}
我尝试使用扩展方法,但扩展方法不允许使用 ref
或 out
关键字作为第一个参数。我似乎找不到任何执行此操作的内置运算符。
关键是要避免赋值,因为obj
的属性集属性被设置为 true,无论它被设置为 null
或其他。
这意味着obj = myVar ?? null;
行不通,obj = myVar != null ? myVar : null;
也行不通
我可以使用静态方法,但该方法应该在哪里?实用类?对象扩展类中的静态方法?
这些是唯一的选项单行 if 还是静态方法?
编辑:我无权访问obj
它是按原样提供给我的许多第三方对象之一。
编辑2:我有大量类似于以下内容的代码:
this.Header.InvoiceHeader.InvoiceTypeCode = row.Field<string>("InvoiceTypeCode");
this.Header.InvoiceHeader.PurchaseOrderDate = row.Field<DateTime?>( "PODate" ) ?? DateTime.Now;
this.Header.InvoiceHeader.PurchaseOrderNumber = row.Field<string>( "PONumber" );
this.Header.InvoiceHeader.SellersCurrency = row.Field<string>( "Currency" ) ?? "USD";
this.Header.InvoiceHeader.BuyersCurrency = row.Field<string>( "Currency" ) ?? "USD";
this.Header.InvoiceHeader.TradingPartnerId = this.EDITradingPartner.TradingPartnerID;
this.Header.InvoiceHeader.CustomerAccountNumber = row.Field<string>("CustomerAccountNumber");
this.Header.InvoiceHeader.CustomerOrderNumber = row.Field<string>("CustomerOrderNumber");
this.Header.InvoiceHeader.PromotionDealNumber = row.Field<string>("PromotionDealNumber");
这是将我的数据库映射到第三方 xml 对象,该对象具有太多节点,无法为每个节点编写包装器。如果属性的值设置为 null
,则 xml 对象输出空标记。换句话说,如果我不希望标签存在,请不要设置它。
如果你有一个聪明的二传手,它实际上知道它的值何时改变,而不仅仅是检查它是否被调用,你可以这样做:
obj = myVar ?? obj;
如果你没有聪明的二传手,就没有办法绕过if
.你想放在哪里完全取决于你和你的编码偏好。
由于我假设obj
是一个变量而不是一个属性,所以这是等价的,但就我个人而言,我发现if
更容易阅读:
obj = myVar ?? obj;
请注意,如果obj
只是一个变量,那么将其设置为自身时没有副作用,但是如果您尝试使用属性执行此操作:
obj.MyProperty = myVar ?? obj.MyProperty;
然后,如果 myVar
为 null,则调用 getter 和 setter;其中任何一个都可能产生原始 if
语句不会发生的副作用。
我建议使用一些方法。如果你在不同的类中使用此逻辑,util class 是你需要的,否则使用私有方法,或者从基类继承受保护的实现。
private void SetValue(ref object property, object value)
{
if (property != null) {
property = value;
}
}