设置单个属性时,无法设置级联属性

时间:2013-04-25 11:50:35

标签: c# .net

以下代码未设置属性。 它只是做任何事情,在调试时只是向前跳,即使使用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; }
}

并设置级联属性然后???

1 个答案:

答案 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);