【发布时间】:2021-08-18 12:56:07
【问题描述】:
这是一个出于好奇而不是实际需要的问题,但我认为找出答案会很有趣,因为我的类太深了,我需要 10 行实例化来设置一个属性。
属性 [MyObj3] 在功能上按我的意愿工作,在 get 属性函数上,它检查对象是否为空并实例化它。而 [MyObj2] 在尝试引用其属性时会抛出空引用异常。
但是以这种方式制作每一个属性是一个比我想要解决的更大的噩梦。所以这里的问题是是否有一种简单的内联方式来处理这个问题。或者我可能没有想到的任何其他方式。
-- 更新:我忘了提,我想保持对象为空,直到需要它,否则它会被包含在 xml 序列化中。
public class Obj1
{
public Obj2 MyObj2 { get; set; }
private Obj3 _obj3;
public Obj3 MyObj3
{
get => _obj3 == null ? _obj3 = new Obj3() : _obj3;
set => _obj3 = value;
}
}
public class Obj2
{
public string MyProp1 { get; set; }
}
public class Obj3
{
public string MyProp1 { get; set; }
}
public void test()
{
var obj = new Obj1();
obj.MyObj2.MyProp1 = "test";//null exception
obj.MyObj3.MyProp1 = "test";//works fine
}
【问题讨论】:
-
@OlivierRogier,getter 确实在 _obj3 上执行 get 部分,在它完成空检查并实例化它之后。这里的代码可以 100% 正常工作,我只是想知道是否有更好/更简单的方法来做到这一点,不会在项目中添加大量的行。
-
obj.MyObj2.MyProp1 = "test";- 这本身就是我书中的代码味道。 -
我不明白这个问题。你问如何重构一些东西?事实上,MyObj2 是空的,因此是例外。您是否想要一种方法来检查是否为 null 并创建任何属性的实例,以从任何属性调用它?为什么不只是在声明时分配它们?
-
为什么不能在构造函数中新建任何子属性?甚至
public ObjX MyObjX {get;set;} = new ObjX()?
标签: c# instantiation getter conditional-operator expression-body