仅当对象在一行上不为空时才设置属性[重复]

Posted

技术标签:

【中文标题】仅当对象在一行上不为空时才设置属性[重复]【英文标题】:Set property only if the object is not null on one line [duplicate] 【发布时间】:2021-02-25 10:44:00 【问题描述】:

我有一个带有一些布尔属性的普通对象,如下所示:

public class Object

    public bool Prop  get; set; 

我想做这样的事情:

Object obj;
if(obj != null)  obj.Prop = true; 

但是由于 stylecop 规则,如果所有内容都在一行中,我不能拥有它,我必须将它拆分为多行,这对我来说变得越来越不可读。我尝试了obj?.Prop = true,但它给了我一个The left-hand side of an assignment cannot contain a null propagating operator 错误,我理解。我可以使用其他任何运算符吗?我不是真正的 c# 专家,所以我不确定我应该使用哪一个。

如果您需要,这里是一个用于测试的快速游乐场:https://ideone.com/LfjKFD

【问题讨论】:

obj = obj != null ? obj.prop = true : null 如果您的可读性越来越差,也许您需要与您的团队讨论它。因为在我的看来你的版本可读性较差,而且它真正基于意见的辩论。 为什么不在这里使用object initializer? 【参考方案1】:

如果没有 if 语句,您将无法做到这一点。在我看来,你唯一能做的就是

if(obj != null) obj.Prop = true;

在这种情况下,您可以将其放在一行中,但不能使用三元运算符。

【讨论】:

【参考方案2】:

?. 也称为 Elvis Operator,仅用于安全访问对象属性而不是设置它。 要设置属性,您需要确保对象已经初始化,因此简单的方法是使用 If 语句

检查 null
if(obj!=null) obj.Prop = someValue;

我不知道,根据你的问题,你是否试图让它比这更简单和可读(就我而言,这是最明显和最直观的方式),但你可以使用其他解决方案,如这个post

【讨论】:

【参考方案3】:

这是你可以达到它的唯一方法,你不需要任何代码行来使用 Prop。Bool Prop 默认为 false。但是由于应该在分配任何东西之前创建对象,我们可以使用默认构造函数来分配 Prop。

public class PlainObject

      public bool Prop  get; set; 

         public PlainObject()
          
           Prop=true;
          


但它没有任何实际用途,因为如果您尝试检查 plainObject.Prop 并且 plainObject 为 null ,您将遇到编译器错误。对象仅在未创建时为空。为什么不检查 if (plainObject==null) 或使用 plainObject?它会是一样的。你不需要任何额外的标志。

【讨论】:

以上是关于仅当对象在一行上不为空时才设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:仅当输入不为空时才启用保存按钮

MongoDb 仅当数组不为空时才在数组中添加字段

MSSQL - 仅当所有值都不为空时才插入值

JPA:仅当结果集不为空时才缓存查询

仅当字段不为空时才进行电子邮件验证

Spring - 仅当值不为空时才设置属性