仅当对象在一行上不为空时才设置属性[重复]
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 语句
检查 nullif(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?它会是一样的。你不需要任何额外的标志。
【讨论】:
以上是关于仅当对象在一行上不为空时才设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章