低级差异:使用静态方法的非静态类与使用静态方法的静态类

时间:2012-04-05 18:11:20

标签: c# .net performance static-classes

我想知道使用带静态方法的非静态类与使用相同静态方法的静态类的一般好处(或缺点)是什么,除了之外我不能使用非静态类中的静态方法作为扩展方法。

例如:

class NonStaticClass
{
    public static string GetData()
    {
        return "This was invoked from a non-static class.";
    }
}

对此:

static class StaticClass
{
    public static string GetData()
    {
        return "This was invoked from a static class.";
    }
}

使用一种方法比另一种方法有什么性能/内存含义?

注意:假设我不需要实例化该类。我的用例场景仅限于以下内容:

Console.WriteLine(NonStaticClass.GetData());
Console.WriteLine(StaticClass.GetData());

4 个答案:

答案 0 :(得分:16)

主要的好处是,如果你使类静态,编译器将确保你的类只有静态成员。

因此,任何阅读代码的人都会立即看到该类无法实例化,并且没有与该类的任何实例一起考虑的交互。因为不能有。

在clr级别,没有static的概念。静态类是abstractsealed,它们有效地阻止了继承和实例化。

至于性能,我没有看到编译器或运行时的任何可能性来优化其中一个。

在这个例子中,我将集中精力向读者表达你的意图。您可以随时优化。

答案 1 :(得分:3)

有一些特点/限制:

  • 您无法实例化静态类
  • 你不能继承静态类

因此,如果你想为你的类做这样的行为(例如helper / util或扩展方法容器),如果你想限制它的用法 - 把它变成static

答案 2 :(得分:3)

没有任何好处或缺点。 这只是建筑决策。

在提供函数集或函数库的情况下,仅使用静态类。 因为你无法实例化它,但你可以像使用它一样。

MyMathLibrary.Plot(...)

此类型通常暗示状态较少的行为。我再说一遍,通常是

当您具有“普通”类型但是需要某种无状态方法时,请使用带有静态成员的简单类,例如:

public class MyType
{
    .... //some members 

    public static MyType ReadFromXml(XmlReader reader) {}
    public static void SaveToXml(MyType mt) {}
}

没有银弹,这只是建筑师选择的问题。

答案 3 :(得分:2)

表现影响:基本没有。

您可以创建NonStaticClass的实例,但由于它没有非静态覆盖方法,因此它与说object obj = new object()非常有用,也就是说它可能对锁定有用而且是关于它。使类静态阻止某人进行修改,但这并不是真正的伤害

这更像是一种自我记录的方式,说没有理由创建该类的实例。