C# 在另一个对象内分配和调用对象属性

C# 在另一个对象内分配和调用对象属性,c#,class,properties,instance,getter-setter,C#,Class,Properties,Instance,Getter Setter,我有一个在一个对象中创建子属性的要求,如下所示(高亮显示), 我想一次完成,就像下面这样。除了创建单独的对象并将其附着到主对象之外 但这不是赋值,请帮助 Test oTest=new oTest(); oTest.Prop1=100; ***oTest.Sub.SubProp3="10";*** 类的定义如下: public class Test { public int Prop1{ get; set; } public int Prop2{ get

我有一个在一个对象中创建子属性的要求,如下所示(高亮显示), 我想一次完成,就像下面这样。除了创建单独的对象并将其附着到主对象之外


但这不是赋值,请帮助

   Test oTest=new oTest();
    oTest.Prop1=100;
    ***oTest.Sub.SubProp3="10";***
类的定义如下:

public  class Test 
{
    public int Prop1{ get; set; }
    public int Prop2{ get; set; }

    private Subtest _sub = null;

    public Subtest Sub {
        get
        {
            return (_sub != null) ? _sub : new Subtest();
        }
        set {  
            _sub = value; 
        }
    }
  }

    public class Subtest
            {
              public int SubProp1{ get; set; }
              public int SubProp2{ get; set; }

              private string _SubProp3;

              public string SubProp3
              {
                get { return _SubProp3; }
                set { _SubProp3= value; }
              }
            }
两种选择:

  • 更改字段初始值设定项:

    private Subtest _sub = new Subtest();
    
  • 在构造时设置新值:

    public Test()
    {
        _sub = new Subtest();
    }
    
  • 获取以下内容时设置新值:

    public Subtest Sub {
        get
        {
            if(_sub == null)
                _sub = new Subtest();
            return _sub;
        }
        set {  
            _sub = value; 
        }
    }
    
第三个选项的主要好处是,子项的创建延迟到检索到属性为止。缺点是具有副作用的吸气剂可能会有问题。

有两种选择:

  • 更改字段初始值设定项:

    private Subtest _sub = new Subtest();
    
  • 在构造时设置新值:

    public Test()
    {
        _sub = new Subtest();
    }
    
  • 获取以下内容时设置新值:

    public Subtest Sub {
        get
        {
            if(_sub == null)
                _sub = new Subtest();
            return _sub;
        }
        set {  
            _sub = value; 
        }
    }
    

第三个选项的主要好处是,子项的创建延迟到检索到属性为止。缺点是,具有副作用的getter可能会有问题。

只需添加到@DStanley中即可简化

    public Subtest Sub {
get
{
   return _sub ?? (_sub = new Subtest());
}
set {  
    _sub = value; 
}

}

只需添加到@DStanley以简化,您可以

    public Subtest Sub {
get
{
   return _sub ?? (_sub = new Subtest());
}
set {  
    _sub = value; 
}

}

“但它并没有赋值”是真的,因为我希望代码会因NullRefresenceException而崩溃,而不仅仅是没有赋值。您是否在try-catch块中有此代码,您正在丢弃异常?“但它并没有赋值”真的,因为我希望代码会因NullRefresenceException而崩溃,而不仅仅是没有赋值。您在try-catch块中是否有此代码,在该块中您将丢弃异常?我更喜欢最后一个选项,但它不会将oTest.subop.subop3设置为10。它总是空的??我在您的定义中没有看到属性
子映射
。事实上,您的示例代码和用法有几个断开连接(
subsp3
是一个字符串,而不是int,等等)。很抱歉,我已经更正了它。检查。应该是,oTest.Sub.subpop3=“10”我更喜欢最后一个选项,但它不会设置oTest.subpop.subpop3=10。它总是空的??我在您的定义中没有看到属性
子映射
。事实上,您的示例代码和用法有几个断开连接(
subsp3
是一个字符串,而不是int,等等)。很抱歉,我已经更正了它。检查。应该是,oTest.Sub.subsp3=“10”我的实际问题是设置subtest对象中prop3的值,如下面的oTest.Sub.subsp3=“10”所示。这仍然是空的,只要对prop3执行相同的操作,只要您尝试调用子测试,它就会实例化它,然后当您调用prop时,它也会实例化。因此,即使您执行test.Subtest.Prop,也必须进一步解释,这意味着prop3将是公共的prop3{get{return_prop3??(prop3=“”);}}}谢谢。这是我的错误我真正的问题是在subtest对象中设置prop3的值,如下面的oTest.Sub.subpop3=“10”。这仍然是空的,只要对prop3执行相同的操作,只要您尝试调用子测试,它就会实例化它,然后当您调用prop时,它也会实例化。因此,即使您执行test.Subtest.Prop,也必须进一步解释,这意味着prop3将是公共的prop3{get{return_prop3??(prop3=“”);}}}谢谢。这是我的错