1

私がクラスを持っているとします

Class ABC
 {
  public string Method1()
  {
   return "a";
  }
  public string Method2()
  {
   return "b";
  }
  public string Method3()
  {
   return "c";
  }
 }

そして今、私は次のような2つの方法でこのメソッドを呼び出しています:

ABC obj=new ABC();
Response.Write(obj.Method1());
Response.Write(obj.Method2());

別の方法

Response.Write(new ABC().Method1());
Response.Write(new ABC().Method2());

出力は、上記の 2 つの方法で同じになります。

obj.Method1()との違いを理解するのを手伝ってくれませんかnew ABC().Method1()

4

2 に答える 2

3

objnew ABC()は別個のインスタンスです。あなたの例では、表示するインスタンスレベルのデータがないため、出力は同じです。

これを試して違いを確認してください:

Class ABC
 {

  public string Name = "default"; 

  public string Method1()
  {
   return "a";
  }
 }

次に、以下のコードを使用して、インスタンス レベルのデータとの違いを示します。

ABC obj=new ABC();
obj.Name = "NewObject";
Response.Write(obj.Method1());
Response.Write(obj.Name);

Response.Write(new ABC().Method1());
Response.Write(new ABC().Name);
于 2012-07-11T17:19:17.960 に答える
1

@d-stanley が言おうとしているのは、非常に貴重なリソースである作成時にメモリを割り当てるということです。

そして、より完全な答えは次のとおりです。いくつかのロジックを念頭に置いて作成されたクラスです。完全にResponse.Write(new ABC().Method1());機能しますが、これは非常に短い機能であり、それほど役に立たないわけではありません...設計するときに、classいくつかの論理境界機能とプロパティを実装しました。たとえばFileStream、の内部プロパティがStreamあり、さまざまなプロパティを介してアクセスできるようにします。オーバーロードされたメソッドで設定し、Open()メソッドで破棄できますDispose()。たとえば、別のクラスもBinaryReader実装しStreamますが、別の方法で脅威を与えます。あなたのロジックから、すべての関数を単一のクラスに実装できます-一部のクラスはandMotherOfAllFunctionsのすべての関数を実装します-しかし、それはそれを行う方法ではありません。FileStreamBinaryReader

別のポイント:ほとんどの場合、クラスの内部ロジック(クラスなど)を初期化するために、ある程度の(または膨大な)量のメモリが使用されます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オブジェクトにアクセスする必要があるすべての関数 (貴重なリソース! ) は、一度だけ初期化された同じインスタンスにアクセスします。

于 2012-07-11T20:23:40.887 に答える