我只是想看看有没有办法可以做到这一点..我有两个班级。一个在另一个中作为财产存在。所以在某种程度上它就像父子类关系..但是我想在这个瞬间设置子对象的值,它的“get”是根据父对象中存在的值来调用的。只有它存在并且不是空的。
我也不想设置子对象(如果它已经被设置好了......)我只是要保持机制尽可能简单,这只不过是搞清楚了。
我的孩子班级
class ChildObject
{
public int? some_val { get; set; }
}
我的父级是
class ParentObject
{
public int? some_val { get; set; }
public ChildObject child
{
get {
//if the chld hasnt been set already
if (child == null)
{
//if the value of the integer has been set
if(some_val != null)
{
//some some method that sets the objects value
//based on teh value of the integer property
SomeMethod();
}
}
return child;
}
set { child = value;}
}
private void SomeMethod()
{
int new_val = this.some_val.Value + 5;
this.child = new ChildObject { some_val = new_val };
}
}
}
在其他一些例行程序中...就像控制台应用程序的程序或我做的以下任何事情
ParentObject p = new ParentObject ();
p.some_val = 1;
ChildObject c = p.child;
int i = c.some_val.Value;
理想情况下,我想添加一些检查以查看父对象中的“some_val”是否已更改,如果是,则“设置”子对象...但是现在我只想弄清楚如何设置该属性第一次被调用。
由于某些原因,当我运行它时它只是崩溃。并没有任何异常。我试过在try catch中包含teh例程,看看问题是什么,但它只是停止运行并关闭执行控制台程序。
答案 0 :(得分:1)
这里的问题是,当您想要为get
或set
方法添加一些逻辑时,您需要包含一个包含实际值的字段。问题出现是因为你实际上有一个无限循环并且可能有一个SO异常。之所以会发生这种情况,是因为当你获得child
之后,你又称之为“{1}}”。return _child;
。
public int? some_val { get; set; }
private ChildObject _child;
public ChildObject child
{
get {
//if the chld hasnt been set already
if (_child == null)
{
//if the value of the integer has been set
if(some_val != null)
{
//some some method that sets the objects value
//based on teh value of the integer property
SomeMethod();
}
}
return _child;
}
set { _child = value;}
}
private void SomeMethod()
{
int new_val = this.some_val.Value + 5;
this.child = new ChildObject { some_val = new_val };
}
答案 1 :(得分:1)
您应该注意相同的字段或值名称。您应该尝试其他值和字段名称。像这样;
private ChildObject child;
public ChildObject Child
{
get {
//if the chld hasnt been set already
if (child == null)
{
//if the value of the integer has been set
if(some_val != null)
{
SomeMethod();
}
}
return child;
}
set { child = value;}
}
你应该为封装原则提供资源。 祝你好运。
答案 2 :(得分:0)
您可以使用其他字段来执行此类操作
public int? some_val { get; set; }
public ChildObject _child;
public ChildObject child
{
get {
//if the chld hasnt been set already
if (_child == null)
{
//if the value of the integer has been set
if(some_val != null)
{
SomeMethod();
}
}
return _child;
}
set { _child = value;}
}
private void SomeMethod()
{
int new_val = this.some_val.Value + 5;
this.child = new ChildObject { some_val = new_val };
}