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

静态方法的唯一主要缺点是它几乎完全不可单元测试。该方法的用户必须绑定到具体方法,而不能绑定到抽象,因此即使不是不可能,也很难伪造或模拟。

但是,这可能是也可能不是问题,具体取决于代码。

您要注意的另一件事是静态数据在对服务器的所有请求中是通用的。

于 2009-11-02T20:16:04.440 回答