2011-12-14 10 views
0

多くの場所を使用する場合は、クラスのインスタントをどこに宣言するのか混乱します。
クラスのインスタントを作成する賢明な方法

私は4タスクなどの挿入、更新を実行し、削除し、注文データを充填していたに注文という名前のフォームがあるとします。これらの4つのすべてのタスクの

LogicはFinalOrderと異なる方法という名前のクラスでから呼び出される瞬間に作成され foの例では、別のクラスファイルでFinalOrder.csここ

言うですFinalOderフォーム。 以下

を参照するためのコードです:

最初の方法:

FinalOrder fo = new FinalOrder(); 

private void Order_Load(object sender, EventArgs e) 
{ 
    dgvOrder.DataSource = fo.FetchOrders(); 
} 
private void btnNewOrder_Click(object sender, EventArgs e) 
{ 
    fo.NewOrder(); 
} 
private void btnUpdateOrder_Click(object sender, EventArgs e) 
{ 
    fo.UpdateOrder(); 
} 
private void btnDiscardOrder_Click(object sender, EventArgs e) 
{ 
    fo.DiscardOrder(); 
} 

第二の方法:

private void Order_Load(object sender, EventArgs e) 
{ 
    FinalOrder fo = new FinalOrder(); 
    dgvOrder.DataSource = fo.FetchOrders(); 
} 
private void btnNewOrder_Click(object sender, EventArgs e) 
{ 
    FinalOrder fo = new FinalOrder(); 
    fo.NewOrder(); 
} 
private void btnUpdateOrder_Click(object sender, EventArgs e) 
{ 
    FinalOrder fo = new FinalOrder(); 
    fo.UpdateOrder(); 
} 
private void btnDiscardOrder_Click(object sender, EventArgs e) 
{ 
    FinalOrder fo = new FinalOrder(); 
    fo.DiscardOrder(); 
} 

第三の道:

FinalOrder fo; 
public Order() 
{ 
    InitializeComponent(); 
    fo = new FinalOrder(); 
} 

private void Order_Load(object sender, EventArgs e) 
{   
    dgvOrder.DataSource = fo.FetchOrders(); 
} 
private void btnNewOrder_Click(object sender, EventArgs e) 
{   
    fo.NewOrder(); 
} 
private void btnUpdateOrder_Click(object sender, EventArgs e) 
{   
    fo.UpdateOrder(); 
} 
private void btnDiscardOrder_Click(object sender, EventArgs e) 
{   
    fo.DiscardOrder(); 
} 

、心と理由でメモリ割り当てを維持したまま使用してもいいである私に教えてください?

答えて

2

第1と第3の方法は同じです。 Formインスタンスが作成されると、両方ともFinalOrderがインスタンス化されます。

そして、あなたのアプリケーションの多くのinsert/delete/update操作がある場合

は、その後、第一又は FinalOrderたびにあなたがこれらのメソッドを呼び出しているのインスタンスを防ぐために、第三の方法のいずれかを使用します。

1

私はそれがFinalOrderとそれが作成されたクラスの両方の特性に依存すると言います。たとえば、作成元のクラスが複数のスレッドからアクセスできる場合は、FinalOrderがスレッドセーフでない限り、おそらくメンバ変数としては必要ありません。

(あなたの例では、それがWebフォーム上で作成されたように見えますし、よりメンバ変数として持ってしても安全でしょう。)

またFinalOrderオブジェクトの動作は、オブジェクトの状態を変更される場合があります(機能の実装を見なければならないだろう)、それは将来の操作がどのように動作するかを変える可能性があり、すべての使用前に再作成するのと同じように動作しません。

1

あなたの「注文」フォームは1つの注文にしか使えないと思います。そうであれば第二の方法は良いです。複数の挿入/更新/削除の方が第1または第3の方が良い場合は、1つのインスタンスしか使用しなかったためです。

1

なぜSingletonパターンを使用しないか、FinalOrderクラスのインスタンスを返すFinalOrderクラスにプロパティを書き込むことで、FinalOrderクラスのインスタンスを共有できます。したがって、他のクラスにインスタンスを作成することを避けることができます。

1

FinalOrderは、高価なリソースを使用しない単純なクラスであれば、私はそれが短くてシンプルな再利用のための機能にカプセル化されたオブジェクトの有効期間を保持第二の方法で行くと思います。 FinalOrderは、アンマネージリソースまたはIDisposableを使用している場合

することは、私はFinalOrderのインスタンス化は非常に高価だった場合、私は考えるかもしれ..

4番目の方法

class FinalOrder : IDisposible 
{ 
    ... 
} 

private void OrderLoad(object sender, EventArgs e) 
{ 
    using (var fo = new FinalOrder(...)) 
    { 
     dgvOrder.DataSource = fo.FetchOrders(); 
    } 
} 

でいいよ共通のFinalOrderインスタンスのプライベートメンバーですが、理想的にはこれを回避します。

+0

アンマネージリソース – Magnus

関連する問題