2013-04-25 52 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