分配前检查空

本文关键字:检查 分配 | 更新日期: 2023-09-27 18:30:43

有没有办法在不使用if语句的情况下在赋值操作之前检查null?有没有办法在一行中提供以下功能,类似于空合并运算符(??)或扩展方法:

if(myVar != null){ obj = myVar;}

我尝试使用扩展方法,但扩展方法不允许使用 refout 关键字作为第一个参数。我似乎找不到任何执行此操作的内置运算符。

关键是要避免赋值,因为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;
   }
}