以下代码未设置属性。 它只是做任何事情,在调试时只是向前跳,即使使用F11
job.TDataReference.CheckedOut = false;
作业属于TJob类型 我用自己的属性建立自己的课程:
public TDataReference TDataReference
{
get
{
return new TDataReference(this.DataReference);
}
set { this.tDataReference = value; }
}
TDataReference也是我使用属性构建自己的类:
public bool CheckedOut
{
get { return (dataRow[CHECKEDOUT].ToString() == "True"); }
set { dataRow[CHECKEDOUT] = value.ToString(); }
}
和和DataRow类型的私有成员dataRow
有趣的是,以下代码可以正常工作并设置属性:
TDataReference dr = job.TDataReference;
dr.CheckedOut = false;
谁可以向我解释。
更新
非常感谢您的回答! 我理解这个问题。 :)
tDataReference取决于this.DataReference中的值,因此可以设置最早的时间tDataReference是当this.DataReference已知时。您如何考虑将其更改为:
private TDataReference tDataReference;
public TDataReference TDataReference
{
get
{
if(tDataReference == null | tDataReference.Id != this.DataReference)
{
this.tDataReference = new TDataReference(this.DataReference);
}
return this.tDataReference
}
set { this.tDataReference = value; }
}
并设置级联属性然后???
答案 0 :(得分:0)
每次调用时,属性getter都会创建新实例。这段代码:
job.TDataReference.CheckedOut = false; // here you setting CheckedOut for the 1st instance of TDataReference
job.TDataReference.CheckedOut = false; // here you setting CheckedOut for the 2nd instance of TDataReference
类似于这个伪代码:
var tDataRef1 = new TDataReference(job.DataReference);
tDataRef1.CheckedOut = false;
var tDataRef2 = new TDataReference(job.DataReference);
tDataRef2.CheckedOut = false;
您不应该以这种方式写属性,这违反了设计准则。考虑这种情况的结果:
job.TDataReference == job.TDataReference // false, ooops...
要避免这种情况,请按以下方式修复属性:
public TDataReference TDataReference
{
get
{
return tDataReference;
}
set { this.tDataReference = value; }
}
// field initialization is optional here, you can omit it
// or make lazy initialization in getter like this:
// return tDataReference ?? (tDataReference = new TDataReference(this.DataReference));
private TDataReference tDataReference = new TDataReference(this.DataReference);