わずかに重複する可能性があります:
クラスがあり、データベースに従業員を追加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
が多少異なって呼ばれるかどうかは重要ですか?