【问题标题】:instantiate object property on get in one line在一行中实例化对象属性
【发布时间】: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


【解决方案1】:

当你像这样实例化 Obj1 时,你可以实例化 Obj2 和 Obj3

public class Obj1
{
    public Obj2 MyObj2 { get; set; } = new Obj2();
    public Obj3 MyObj3 { get; set; } = new Obj3();
}

【讨论】:

  • 我在提出问题时忘记了这一点,但我不想这样做的原因是因为它会在进行 xml 序列化时被包含在内。我想保持对象为空,直到它被使用
  • 在那种情况下,我找不到比你已经做过的更简单的方法了
猜你喜欢
  • 2012-07-31
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2015-04-30
  • 2011-11-01
相关资源
最近更新 更多