【问题标题】:Low-level difference: non-static class with static method vs. static class with static method低级差异:具有静态方法的非静态类与具有静态方法的静态类
【发布时间】:2012-04-19 11:55:07
【问题描述】:

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

例如:

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());

【问题讨论】:

    标签: c# .net performance static-classes


    【解决方案1】:

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

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

    在 clr 级别,没有 static 的概念。一个静态类既是abstract又是sealed,有效的防止了继承和实例化。

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

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

    【讨论】:

      【解决方案2】:

      有一些特殊性/限制:

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

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

      【讨论】:

      • 检查我编辑的帖子以了解用例场景 - 我通常想知道在不实例化的情况下使用它是否有任何区别。
      • 除了你提到的几点:你也不能使用静态类作为局部变量、字段或形参的类型。您不能将其用作数组的元素类型。您不能将其用作泛型类型参数列表中的类型参数。
      • @FishBasketGordo:我们同时更新了我的答案。请再做一次,或发表评论。
      • @Dennis:关于编辑的评论对 Fish 来说是真实的,我错误地提到了你,对不起 :)
      【解决方案3】:

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

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

      MyMathLibrary.Plot(...)
      

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

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

      public class MyType
      {
          .... //some members 
      
          public static MyType ReadFromXml(XmlReader reader) {}
          public static void SaveToXml(MyType mt) {}
      }
      

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

      【讨论】:

      • @Dennis Delimarsky:为什么你说“我的用例场景仅限于......”。我不认为这是一个限制。取决于您的架构,通过明确您的 API 的行为,它可能是非常好的设计选择。
      • 这只是一个示例,我试图表明我并不打算实际实例化该类。
      【解决方案4】:

      性能影响:基本上没有。

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 2020-02-17
        • 1970-01-01
        • 2012-07-14
        相关资源
        最近更新 更多