0

以下代码未设置该属性。它什么也不做,调试时只是向前跳,即使是 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; }
}

然后设置级联属性工作吗???

4

1 回答 1

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);
于 2013-04-25T11:58:19.350 回答