【问题标题】: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

标签: c#


【解决方案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?它会是一样的。你不需要任何额外的标志。

      【讨论】:

        猜你喜欢
        • 2016-08-29
        • 2012-03-10
        • 2016-02-29
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 2019-04-04
        • 2013-12-05
        • 1970-01-01
        相关资源
        最近更新 更多