C# 赋值前的空检查

C# 赋值前的空检查,c#,null,operators,extension-methods,static-methods,C#,Null,Operators,Extension Methods,Static Methods,在赋值操作之前,是否有方法在不使用if语句的情况下检查null? 是否有一种方法可以在一行中提供以下功能,类似于空合并运算符(??)或扩展方法: if(myVar != null){ obj = myVar;} 我尝试使用扩展方法,但扩展方法不允许使用ref或out关键字作为第一个参数。我似乎找不到任何内置的操作员可以这样做 这一点是为了避免赋值,因为无论是将obj的propertyset属性设置为null还是其他属性,都会将其设置为true 含义obj=myVar??无效将不起作用,obj=

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

if(myVar != null){ obj = myVar;}
我尝试使用扩展方法,但扩展方法不允许使用
ref
out
关键字作为第一个参数。我似乎找不到任何内置的操作员可以这样做

这一点是为了避免赋值,因为无论是将
obj
的propertyset属性设置为
null
还是其他属性,都会将其设置为true

含义
obj=myVar??无效将不起作用,
obj=myVar!=无效的myVar:null

我可以使用静态方法,但是该方法应该在哪里?实用类?对象扩展类中的静态方法

这些是单行ifs还是静态方法的唯一选项

编辑: 我无法访问
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");
this.Header.InvoiceHeader.InvoiceTypeCode=row.Field(“InvoiceTypeCode”);
this.Header.InvoiceHeader.PurchaseOrderDate=行.字段(“PODate”)??日期时间。现在;
this.Header.InvoiceHeader.PurchaseOrderNumber=行.字段(“PONumber”);
this.Header.InvoiceHeader.SellersCurrency=行字段(“货币”)??“美元”;
this.Header.InvoiceHeader.BuyersCurrency=行字段(“货币”)??“美元”;
this.Header.InvoiceHeader.TradingPartnerId=this.EDITradingPartner.TradingPartnerId;
this.Header.InvoiceHeader.CustomerAccountNumber=行.字段(“CustomerAccountNumber”);
this.Header.InvoiceHeader.CustomerOrderNumber=行.字段(“CustomerOrderNumber”);
this.Header.InvoiceHeader.PromotionDealNumber=行.字段(“PromotionDealNumber”);

这是将我的数据库映射到第三方xml对象,该对象的节点太多,无法为每个节点编写包装器。如果属性值设置为
null
,则xml对象将输出空标记。换句话说,如果我不希望标记存在,那么就不要设置它。

因为我假设
obj
是一个变量而不是一个属性,这是等效的,但我个人觉得
if
更容易阅读:

obj = myVar ?? obj;
请注意,如果
obj
只是一个变量,那么将其设置为自身时没有副作用,但是如果您尝试使用以下属性:


如果
myVar
为空,则调用getter和setter;这两种方法中的任何一种都可能具有原始
if
语句不会出现的副作用。

由于我假设
obj
是一个变量而不是一个属性,这是等效的,但我个人认为
if
更容易阅读:

obj = myVar ?? obj;
请注意,如果
obj
只是一个变量,那么将其设置为自身时没有副作用,但是如果您尝试使用以下属性:


如果
myVar
为空,则调用getter和setter;这两种方法中的任何一种都可能具有原始
if
语句不会出现的副作用。

如果您有一个智能setter,它实际上知道它的值何时更改,而不只是检查它是否被调用,您可以这样做:

obj = myVar ?? obj;

如果您没有智能设置器,则无法绕过
If
。您想将其放置在何处完全取决于您和您的编码首选项。

如果您有一个智能setter,它实际上知道其值何时更改,而不只是检查是否调用了它,您可以执行以下操作:

obj = myVar ?? obj;

如果您没有智能设置器,则无法绕过
If
。你想把它放在哪里完全取决于你和你的编码偏好。

我建议使用一些方法。若您将在不同的类中使用此逻辑,那个么util类就是您所需要的,否则使用私有方法,或者使用受保护的实现从基类继承

private void SetValue(ref object property, object value)
{
   if (property != null) {
      property = value;
   }
}

我建议使用一些方法。若您将在不同的类中使用此逻辑,那个么util类就是您所需要的,否则使用私有方法,或者使用受保护的实现从基类继承

private void SetValue(ref object property, object value)
{
   if (property != null) {
      property = value;
   }
}

这是否完全避免了任务?或者它只是将它分配给它自己?它只是将它设置为它自己。这会完全避免分配吗?或者它只是把它分配给它自己?它只是把它设置为它自己。你为什么试图让你的代码不可读?你到底想做什么?你能发布一个完整的代码示例吗?因为这没有多大意义。@丹尼斯,我正试图做相反的事情,我想说得更清楚(通过使用带有描述性名称的扩展方法)@YuvalItzchakov,我已经用我正在使用的一小段代码编辑了这个问题。扩展方法当然允许
ref
out
,只是不适用于第一个参数(即
参数)。但这并不重要,因为您试图解决的问题仅在处理属性时存在,并且您不能通过引用传递属性。为什么您试图使代码不可读?您到底想做什么?你能发布一个完整的代码示例吗?因为这没有多大意义。@丹尼斯,我正试图做相反的事情,我想说得更清楚(通过使用带有描述性名称的扩展方法)@YuvalItzchakov,我已经用我正在使用的一小段代码编辑了这个问题。扩展方法当然允许
ref
out
,只是不适用于第一个参数(即
参数)。但这并不重要,因为您试图解决的问题仅在处理属性时存在,并且您不能通过引用传递属性