5

いつ静的関数を使用するのか、ASP.NET でいつ使用しないのか疑問に思っていました。

それらを使用する際の長所と短所は何ですか、パフォーマンスなどのさまざまな側面、次の優れたプラクティスなど(および関連すると思われるものは何でも)。

4

3 に答える 3

4

短所:

  • スレッド化の問題 (静的関数はインスタンスを呼び出す必要がないため、コードのさまざまな部分から簡単に呼び出すことができます。また、共有状態に対して読み取り/書き込みを行うと、マルチスレッド環境でこの状態が破損する可能性があります。 ASP.NET など)
  • 単体テストが困難 (静的関数はオブジェクト インスタンスを必要としないため、コンストラクター注入は不可能です。つまり、依存関係を注入する唯一の方法は、それらを引数として関数自体に渡すことです)

長所:

  • パフォーマンス (これには疑問があります - ほとんどの場合、コードの他の部分と比較してパフォーマンスの向上は完全に無視できます)
于 2009-11-02T20:15:16.640 に答える
2

他のアプリケーションと同様に、静的が適切なソリューションである状況が確実に存在します。リクエストスコープではなく、アプリケーションスコープに存在する必要があるオブジェクトがある場合は常に、静的である必要があり、静的メソッドを使用してアクセスして操作する必要があります。

例として、私が最近書いた ASP.NET アプリケーション用のコード スニペットを次に示します。これは基本的にシリアライザー キャッシュです。シリアライザーは作成するのに費用がかかりますが、アプリケーションが存続している限り、タイプごとに同じものを再利用できるため、各リクエスト スレッドで時間を無駄にする必要はありません。

(注:これは、静的な側面を示すために削除されています)

public class XmlSerializerUtility
{
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
    private static object sync = new object();

    public static T Deserialize<T>(string input)
    {
       XmlSerializer xs = GetSerializer(typeof(T));
        using (StringReader sr = new StringReader(input))
        {
            return (T)xs.Deserialize(sr);
        }
    }

    public static XmlDocument Serialize(object input)
    {
        XmlDocument doc = new XmlDocument();
        XmlSerializer xs = GetSerializer(input.GetType());
        using (MemoryStream stream = new MemoryStream())
        {
            xs.Serialize(stream, input);
            stream.Position = 0;
            doc.Load(stream);
        }
        return doc;
    }

    private static XmlSerializer GetSerializer(Type type)
    {
        lock (sync)
        {
            XmlSerializer xs = null;
            if (!serializers.ContainsKey(type))
            {
                xs = new XmlSerializer(type);
                serializers.Add(type, xs);
            }
            else
            {
                xs = serializers[type];
            }
            return xs;
        }
    }
}
于 2009-11-02T20:35:11.680 に答える
1

静的メソッドの唯一の大きな欠点は、ほぼ完全に単体テストができないことです。メソッドのユーザーは具体的なメソッドにバインドする必要があり、抽象化にバインドすることはできません。したがって、不可能ではないにしても、偽造やモック化が困難になります。

ただし、コードによっては、これが問題になる場合とそうでない場合があります。

もう 1 つ気を付けなければならないことは、静的データはサーバーへのすべての要求で共通であるということです。

于 2009-11-02T20:16:04.440 に答える