2

コードを最適化するための提案を行う Code Issues と呼ばれる機能を備えた Developer Express の CodeRush 製品を使用しています。パラメータを持つメソッドがある場合、このメソッドを静的にすることが常に提案されることに気付きました。最高のコードと最適化を書こうとする精神の中で、DevExpress が私たちを助けようとしていると私は思いますが、メソッドを静的にすることが実際に賢明かどうかについて、さまざまな意見を聞いています。

メソッドが静的であるべき場合についてどう思いますか? これを行う利点はありますか?影響?メソッドを実行するにはパラメーターが必要なので、問題はありません。複数のユーザー/用途で問題になることはありません。

良いまたは悪い?

ありがとう。

4

5 に答える 5

6

メソッドにパラメータがあるかどうかは関係ありません。唯一の考慮事項は、メソッドがクラスの非静的 (つまり、インスタンスベース) メンバーにアクセスしようとするかどうか、またはクラス内の他の静的メンバーがそれを呼び出すかどうかです....

例えば

 private static int Add(int a, int b) 
 { return a + b; }

静的にすることができます-パラメーターを持っていても、コンテナークラスのインスタンスメンバーにはアクセスしません

ただし、次のクラスでPrintHello()は、インスタンス ベースのフィールドにアクセスするため、useCountパラメーターがなくても static として宣言できません。

public class myClass
{
    private int useCount = 0;

    private void PrintHello()
    { 
        useCount = useCount + 1;
        Console.Write("Hello");
    }
}
于 2011-11-11T15:28:25.097 に答える
2

他の人が示したように、パラメーターの存在は考慮事項ではありません。メソッドがどのインスタンス メンバーにもアクセスしない場合、ヒントが存在します。

これはいつ役に立ちますか?

候補メソッドがその機能を実行するために状態を必要としない場合、この関数の呼び出し元が親クラスのインスタンスを所有または作成する必要はありません。

この要件を削除することで、呼び出し元のコードにエラー (または一部の言語では警告) が表示され、代わりに型参照が必要な問題のメソッドに「インスタンス参照ではアクセスできない」ことが示されます。

Type 参照を使用するように呼び出しステートメントを書き直すと、型の元のインスタンスが不要であることがわかり、コードをさらにリファクタリングして同じ型の作成をなくすことができます。

このインスタンス タイプを削除すると、CPU とメモリが節約されます。

問題のメソッドにはインスタンス化コードが必要ないため、呼び出し元のメソッド (またはそれ自体の呼び出し元) が読みやすくなる可能性があります。

さらに、インスタンス化コードが欠落している場合、これにより 1 つ以上のメソッドが読みやすくなります。

たとえば、System.Math クラスは静的であるため、静的関数で満たされています。これらの関数の呼び出しコードは、実行前に数学クラスのインスタンスをインスタンス化する必要がある場合、読みにくくなります。

于 2011-11-14T08:08:31.380 に答える
2

静的メソッドは単体テストや依存性注入で使用するのが難しい場合があるため、通常は静的メソッドを使用しないようにしています。(タイプモックについては知っています)。メソッドがしっかりと含まれている場合にのみ、静的メソッドの使用を検討します。

于 2011-11-11T15:34:12.393 に答える
1

個人的には、この件に関して私は 2 つの考えがあります。

一方では、インスタンス メンバーにアクセスしないため、メソッドを静的にする必要があると主張する人もいます。それにはいくつかの真実がありますが、私が実行して実行することを常に急いでいるとは限らないいくつかの理由があります。

  1. 名前空間の汚染。この習慣を身につけてしまうと、すべてがグローバル モジュールにひとまとめにされていた「古き良き時代」の匂いがし始め、関数を勝手に呼び出すことができるようになります。私はその考えに震えます。確かに、静的メソッドはクラスと名前空間に編成されていますが、それでもインスタンス固有ではなく、グローバル関数のように思えます。彼らは私のつま先をチョークボード上の指の爪の音のようにカールさせます.

  2. メソッドが今日インスタンス変数にアクセスしないからといって、明日もアクセスしないとは限りません。そのためのリファクタリングは重大な変更です。メソッドを静的にすることは、簡単に下すべき決定ではありません。これは、メソッドがそのように使用されることを意図していることを知っているからであり、現在インスタンス変数を使用していないことにツールが気付いたからではありません。

そうは言っても、静的メソッドは非常に有用な目的を果たし、適切に使用すると、無数の問題を見事に解決できると私は信じています。私は、Resharper が私がそうすべきだと考えているかどうかとは何の関係もないことが多い非常に特定の目的のために、意図したときにそれらを使用します。

メソッドが静的とマークされている場合、アプリケーションがより効率的に実行されると述べているものは見たことがありません。静的クラスはアプリケーションの存続期間中存在し、割り当てられたリソースはアプリケーションが範囲外になるまで解放されないため、パフォーマンスが低下すると考える傾向があるかもしれません。(一方で、実装によっては、これによりパフォーマンスが向上する場合があります。)

最終的に、パフォーマンスの問題は実装に帰着します。

于 2011-11-11T15:43:22.540 に答える
0

私は個人的にそれらを静的にします。インスタンスで何かが機能しない場合、インスタンスのメンバーであってはならない (ただし、クラスの) ほうが正しいと感じます。

たとえば、2 つのパラメーターを取り、それらを追加して結果を返す add メソッドは、それ自体を処理する必要がないため、静的にすることができます。インスタンスメソッドとして残した場合、それを実行するインスタンスに違いがあることを暗示している可能性があります。

コードの可読性だけで、効率の点で利点があるとは思いません (詳しく調べたことはありませんが)。

于 2011-11-11T15:32:42.720 に答える