2013-04-25 53 views
0

以下代码未设置属性。 这只是什么都不做,并在调试只是向前跳转,甚至与F11设置单个属性时无法设置级联属性正常工作

job.TDataReference.CheckedOut = false; 

作业类型的TJob 类我自己建与物业:

public TDataReference TDataReference 
{ 
    get 
    { 
     return new TDataReference(this.DataReference); 
    } 
    set { this.tDataReference = value; } 
} 

TDataReference也是I类自己建与物业:

public bool CheckedOut 
{ 
    get { return (dataRow[CHECKEDOUT].ToString() == "True"); } 
    set { dataRow[CHECKEDOUT] = value.ToString(); } 
} 

与和类型的私有成员数据行的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; } 
} 

和wil设置级联属性工作然后???

+0

您的意思是创建它检索一个新的'TDataRefernece'每一次?这违背了制定者的观点。你什么意思'不设置属性'?分配一个值?什么是'tDataReference'? – 2013-04-25 11:55:32

回答

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); 
+0

O我明白了。你是对的。 – Ephedra 2013-04-26 07:07:50

+0

不能在这里使用文本格式化...所以我会回答我的文章 – Ephedra 2013-04-26 07:21:45

+0

你应该更新*问题*。不要发布答案,这是你问题的一部分。 – Dennis 2013-04-26 07:33:32