我一直在想,在 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;
}
}
}
静态方法的唯一主要缺点是它几乎完全不可单元测试。该方法的用户必须绑定到具体方法,而不能绑定到抽象,因此即使不是不可能,也很难伪造或模拟。
但是,这可能是也可能不是问题,具体取决于代码。
您要注意的另一件事是静态数据在对服务器的所有请求中是通用的。