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
,只是不适用于第一个参数(即此
参数)。但这并不重要,因为您试图解决的问题仅在处理属性时存在,并且您不能通过引用传递属性