0

次のコードはプロパティを設定しません。F11を使用しても、何もせず、デバッグ時にジャンプするだけです

job.TDataReference.CheckedOut = false;

ジョブはタイプ TJob A クラスで、プロパティを使用して自分で作成します。

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

プロパティ ゲッターは、呼び出すたびに新しいインスタンスを作成します。このコード:

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 に答える