いつ静的関数を使用するのか、ASP.NET でいつ使用しないのか疑問に思っていました。
それらを使用する際の長所と短所は何ですか、パフォーマンスなどのさまざまな側面、次の優れたプラクティスなど(および関連すると思われるものは何でも)。
いつ静的関数を使用するのか、ASP.NET でいつ使用しないのか疑問に思っていました。
それらを使用する際の長所と短所は何ですか、パフォーマンスなどのさまざまな側面、次の優れたプラクティスなど(および関連すると思われるものは何でも)。
短所:
長所:
他のアプリケーションと同様に、静的が適切なソリューションである状況が確実に存在します。リクエストスコープではなく、アプリケーションスコープに存在する必要があるオブジェクトがある場合は常に、静的である必要があり、静的メソッドを使用してアクセスして操作する必要があります。
例として、私が最近書いた 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;
}
}
}
静的メソッドの唯一の大きな欠点は、ほぼ完全に単体テストができないことです。メソッドのユーザーは具体的なメソッドにバインドする必要があり、抽象化にバインドすることはできません。したがって、不可能ではないにしても、偽造やモック化が困難になります。
ただし、コードによっては、これが問題になる場合とそうでない場合があります。
もう 1 つ気を付けなければならないことは、静的データはサーバーへのすべての要求で共通であるということです。