13

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

例如:

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

4 回答 4

16

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

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

在 clr 级别,没有static. 静态类是abstractand sealed,它有效地防止了继承和实例化。

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

在这个例子中,我将专注于向读者尽可能清楚地表达你的意图。您可以随时进行优化。

于 2012-04-05T18:15:27.633 回答
3

有一些特殊性/限制:

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

因此,如果您假设您的类有这样的行为(例如 helper/util 或扩展方法容器),如果您想限制它的使用 - make it static

于 2012-04-05T18:14:21.347 回答
3

没有好处或缺点。这只是架构决定。

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

MyMathLibrary.Plot(...)

这种类型通常暗示状态较少的行为。我重复一遍,通常

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

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

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

没有灵丹妙药,这只是架构师选择的问题。

于 2012-04-05T18:19:18.983 回答
2

性能影响:基本上没有。

您可以创建 的实例NonStaticClass,但由于它没有非静态覆盖方法,因此它与说 几乎一样有用object obj = new object(),也就是说,它可能对锁定很有用,仅此而已。将类设为 static 可以防止有人对其进行新的修改,但这并没有真正的危害

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

于 2012-04-05T18:14:38.830 回答