次の抜粋は、FXCopの警告からのものです。
インスタンスデータにアクセスしたり、インスタンスメソッドを呼び出したりしないメソッドは、静的としてマークできます(Visual Basicでは共有)。メソッドを静的としてマークした後、コンパイラーはこれらのメンバーに非仮想呼び出しサイトを発行します。非仮想呼び出しサイトを発行すると、実行時に各呼び出しをチェックして、現在のオブジェクトポインターがnullでないことを確認できなくなります。これにより、パフォーマンスに敏感なコードのパフォーマンスが測定可能に向上する可能性があります。場合によっては、現在のオブジェクトインスタンスにアクセスできないことが、正確性の問題を表していることがあります。
インスタンスデータやメソッドにアクセスしない場合にプライベートメソッドを静的にすることのパフォーマンス上の利点は理解していますが、ほとんどの場合、上記のアドバイスが適切かどうかはわかりません。非常にパフォーマンスが重要なコードを作成していて、それをc#で作成する選択肢がない場合は、感情を理解できますが、一般的に、堅牢で読みやすく、リファクタリングしやすいコードがパフォーマンスよりも優先されることを考慮してください。あなたは実際にこのアドバイスに従いますか?
プライベート静的メソッドで私が抱えている問題は、クラスをリファクタリングする必要があるときに、静的メソッドを使用するとそれがより困難になることです。静的メソッドが多数あり、インスタンス変数を使用するように1つを変更する必要があり、そのメソッドが他のプライベート静的メソッドで使用されている場合、これを機能させるにはさらに変更を加える必要があります。以下に例を示します(これは、要点を示すための最小限の実装であることに注意してください)。
public class Test
{
private IService myService;
private static void DoSomething()
{
DoSomethingElse();
}
private static void DoSomethingElse()
{
DoSomethingMore();
}
private static void DoSomethingMore()
{
Console.Write("DO SOMETHING");
}
}
DoSomethingMoreメソッドで使用する場合myService
は、そのメソッドを非静的にするだけでなく、前の2つのメソッドも作成する必要があることを意味します。これは面倒なようです。
これについて他の人々はどう思いますか?