@d-stanley が言おうとしているのは、非常に貴重なリソースである作成時にメモリを割り当てるということです。
そして、より完全な答えは次のとおりです。いくつかのロジックを念頭に置いて作成されたクラスです。完全にResponse.Write(new ABC().Method1());
機能しますが、これは非常に短い機能であり、それほど役に立たないわけではありません...設計するときに、class
いくつかの論理境界機能とプロパティを実装しました。たとえばFileStream
、の内部プロパティがStream
あり、さまざまなプロパティを介してアクセスできるようにします。オーバーロードされたメソッドで設定し、Open()
メソッドで破棄できますDispose()
。たとえば、別のクラスもBinaryReader
実装しStream
ますが、別の方法で脅威を与えます。あなたのロジックから、すべての関数を単一のクラスに実装できます-一部のクラスはandMotherOfAllFunctions
のすべての関数を実装します-しかし、それはそれを行う方法ではありません。FileStream
BinaryReader
別のポイント:ほとんどの場合、クラスの内部ロジック(クラスなど)を初期化するために、ある程度の(または膨大な)量のメモリが使用されますSqlConnection
。次にOpen()
、データベースを呼び出すか、その他のメソッドを呼び出します。状態マシンの初期化、マネージからアンマネージへの呼び出し、および多くのコードの実行をサポートするために、いくつかの非常に強力なメカニズムがスローされます。
実際にあなたがしていることnew SomeCLass().SomeMethod<int>(ref AnotherObject)
は次のとおりです。
Response.Write(
var tmpABC = new ABC(); // Constructor call . Executed always (may throw)
string result = tmpABC.Method1(); // Or whatever could be casted to `string`
tmpABC.Dispose(); // GC will kick-in and try to free memory
return result;
);
ご覧のとおり、これは、このように記述した場合と同じコードです。したがって、ここで大量のメモリ割り当てが発生し、この貴重なメモリがすぐにすべて破棄されます。ABC()
クラスとそのすべての機能を一度初期化してから、それをどこでも使用して、メモリの割り当てを最小限に抑える方が理にかなっています。たとえば、DAL クラスのすべての関数呼び出しで関数を開き、すぐに閉じても意味がありませんSqlConnection
。ローカル変数を宣言し、それを有効にしておくことをお勧めします。一部の完全に初期化されたクラスは、アプリケーション スレッド プロセスが存在する限り有効です。したがって、このコード スタイルの場合:
public class Program
{
private static FileStream streamToLogFile = new FileStream(...);
public int Main(string [] args)
{
new Run(new Form1(streamToLogFile));
}
}
このロジックでは、クラスを保持する必要はなくForm1
、インラインで作成しましたが、FileStream
オブジェクトにアクセスする必要があるすべての関数 (貴重なリソース! ) は、一度だけ初期化された同じインスタンスにアクセスします。