0

わずかに重複する可能性があります:

インスタンスメソッドとrefパラメータを使用した静的メソッド

クラスがあり、データベースに従業員を追加Employeeするメソッドがある場合。AddEmployee私が採用できる方法はいくつかありますが、その1つは次のようなものです。

protected void AddEmployee(SQLConnection con)
{
    // this is an instance method, 
    // connection is passed in parameter
    // add this class to database, using the connection
}

そして私はそれをこのように呼ぶでしょう

   var emp = new Employee();
   // set its properties
   emp.AddEmployee(theSQLConnectionObject);

もう1つのアプローチは、静的メソッドを作成し、EmployeeクラスのインスタンスとSQLConnecionを渡してから、このように従業員クラスのインスタンスをデータベースに追加することです。

static protected void AddEmployee(Employee emp, SQLConnection Con)
{
    // this is static method
    // connection again in parameter
    // add emp class to database, using the connection
}

これは、として追加できます。

var emp = new Employee();
// set its properties
Employee.AddEmployee(emp, theSQLConnectionObject);

どちらが良いアプローチか、どちらが好きか、そしてその理由を知りたいのですが。また、C#固有のことを知りたいのですが、関連する質問は言語固有ではありません。

さて、始めに、この部分のために少し可能性のある重複を言いました。私はC#経由でCLR
を読んでいましたが、第8章のセクション型構築子では次のようになります。

メソッドをコンパイルするとき、JITコンパイラーは、メソッドに型コンストラクターを実行するための呼び出しを発行する必要があると判断します。JITコンパイラが呼び出しを発行することを決定した場合、JITコンパイラは呼び出しを発行する場所を決定する必要があります。2つの可能性があります

  • 正確なセマンティクス。最初のインスタンスを作成するコードの直前、またはクラスのメンバーの継承されていないファイルにアクセスするコードの直前に呼び出しを発行します。

  • Before-field-initセマンティクスは、コードが静的フィールドまたは静的メソッドまたはインスタンスメソッドにアクセスする前、またはインスタンスコンストラクターを呼び出す前にコードを発行します。

もう少し説明し、パフォーマンス比較の例を示しましたが、パフォーマンスにはかなりの違いがありました。簡潔にするためにそれを含めていませんが、誰かがそれを望む場合は、コメントして質問を更新します。
例の後、彼は続けます

C#コンパイラが、インライン初期化を使用する静的フィールドを持つクラスを検出すると、コンパイラはメタデータの型定義テーブルでbefore-field-initを発行します。明示的なコンストラクターを持つクラスを検出した場合、メタデータにbefore-field-intoを出力しません。

さて、Employeeクラスに静的フィールドがある場合、状況はどのように異なりますか?私が考えることができることから、4つの異なるケースがあります

  • AddEmployeeはインスタンスであり、クラスには静的コンストラクターがありません

  • AddEmployeeはインスタンスであり、クラスには静的コンストラクターがあります

  • AddEmployeeは静的であり、クラスには静的コンストラクターがありません

  • AddEmployeeは静的であり、クラスには静的コンストラクターがあります

AddEmployeeメソッドがで呼び出され、そのたびに従業員のインスタンスが作成されると仮定すると、これらすべてのケースでパフォーマンスはどのように異なりますかbuttonClick(どちらの場合も、両方ともインスタンスが必要なため、静的メソッドであるかどうかに関係なく)、したがって、毎回新しいインスタンスが作成されます。また、これAddEmployeeが多少異なって呼ばれるかどうかは重要ですか?

4

2 に答える 2

2

パフォーマンスはさておき、私は従業員を別のクラスに保存する責任を移すことを好みます。SRPに準拠しており、おそらく少しOCPもあります。

于 2012-07-19T12:22:35.817 に答える
0

この状況では静的メソッドを使用しないことをお勧めします。多くの場合、静的メソッドは非常に醜い解決策です。より良い方法は、インスタンスメソッドを使用してデータマッパークラスを作成することです。たとえば、継承を使用してデータマッパークラスの動作を拡張し、さまざまな保存アクションを取得する必要があると判断した場合に役立ちます。最初はパフォーマンスについて考えないでください。特にこの瞬間、優れたプログラマーの経験から、パフォーマンスに直面したときにパフォーマンスの問題を解決する必要があることがわかります。アプリケーションのコードの各行を最適化すると、アプリケーションはまったく完成しません。一般的に、コードのパフォーマンスを改善する必要がある場所が2〜3ある場合もありますが、この種の場所がまったくない場合もあります。だから、最初にあなたのデザインについて考えてみてください、

于 2012-07-20T02:02:01.217 に答える