1

次の抜粋は、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つのメソッドも作成する必要があることを意味します。これは面倒なようです。

これについて他の人々はどう思いますか?

4

1 に答える 1

5

これは面倒なようです。

メソッドを変更すると、関数呼び出しのチェーン全体がインスタンスに依存するようになると考えると、DoSomethingMore代わりに「負担」であるという変更の感覚が「必要」になるはずです。

最初に考慮すべきことは、作成しているメソッドのセマンティクスです。メソッドを作成するときは、コードをインスタンスメソッド(意味的には単一のインスタンスに関連付けられたアクションである必要があるため)にするか、静的メソッド(その他の場合)にするかを自問する必要があります。その決定により、作成方法が決まります。メソッド。

本番コードでは受け入れられないパフォーマンスの欠点を測定するまでは、ドメインにとって意味のあるものに応じて、メソッドをインスタンスまたは静的にする必要があります。

于 2013-02-04T17:01:18.193 に答える