C# 静态和单例类性能(内存管理)之间有什么区别吗

C# 静态和单例类性能(内存管理)之间有什么区别吗,c#,memory-management,C#,Memory Management,我读了一篇关于的文章,并注意到这句话: 大量使用静态类和方法,以实现简单性和更好的性能 表演 我的问题是,静态和单例性能之间有什么区别吗? 如果有原因的话?如果您正确地实现了单例,那么我会说没有性能差异 唯一的区别是,对于标准静态,您可以随时让系统创建新实例,而单例强制要求只创建一次 差别不大。和往常一样,如果你有疑问,请提供个人资料——但我严重怀疑你会发现任何有趣的东西 静态方法有三个主要优点: 无需传递隐式此 没有虚拟方法调用 无空检查 通过不使用Virtual关键字和不实现接口,可以避

我读了一篇关于的文章,并注意到这句话:

大量使用静态类和方法,以实现简单性和更好的性能 表演

我的问题是,静态和单例性能之间有什么区别吗?
如果有原因的话?

如果您正确地实现了单例,那么我会说没有性能差异


唯一的区别是,对于标准静态,您可以随时让系统创建新实例,而单例强制要求只创建一次

差别不大。和往常一样,如果你有疑问,请提供个人资料——但我严重怀疑你会发现任何有趣的东西

静态方法有三个主要优点:

  • 无需传递隐式
  • 没有虚拟方法调用
  • 无空检查
通过不使用
Virtual
关键字和不实现接口,可以避免虚拟方法调用。它们也会在运行时进行评估,并尽可能进行优化

传递
this
对于
struct
s可能很棘手,但这不是通常实现单例的方式。对于普通引用类型,这可能是一个简单的按寄存器传递引用

最后一点也应该是显而易见的——由于C#中的契约,如果您试图在
null
引用上调用一个方法,那么您应该得到
null引用异常
——即使该方法实际上根本没有使用
this

然而,性能并不是唯一有用的指标。仔细想想,静态类和静态方法与功能模块和函数几乎没有什么不同。我认为这正是本文的原著所暗指的——如果做得好,函数式编程比将代码放入任意定义的类要简单得多。我假设,虽然有很多静态方法(函数),但静态字段却很少——如果状态更改失控,则很难管理和理解。这对共享状态有双重作用,您很难找到比公共静态字段更共享的状态


再说一遍,性能只是一回事。软件开发是一种平衡行为,只关注一个指标是不行的。如果您过于关注(低级别)性能,可能会错过维护和可读性,甚至错过高级别性能优化。如果避免开销是至关重要的,那就使用静态字段和静态方法吧。如果您需要并行处理10k请求,则可能需要大量低级别优化。但是要确保你知道这通常是一种权衡。

你能解释一下不需要传递隐式this吗?@Shahrooz好吧,当你调用实例方法时,你需要传递
this
-实例。静态方法没有这个功能——它们不绑定到任何实例。然而,我需要指出的是,如果你不得不问这个问题,忘记任何性能差异。像这样的建议对你没有任何好处——坚持好的、干净的做法,直到你充分了解事情在幕后是如何运作的。你能告诉我一个推荐人吗?@Shahrooz什么推荐人?C#语言规范?@Shahrooz你还没有告诉我你想要什么参考:)我可以分享很多链接,但你可能有一些特别的想法:)如何“保持系统打开”来创建静态类的新实例?如果有什么不同的话,那么这完全是反向的——理论上可以创建多个单例,而实例的问题对于静态类来说甚至没有意义。@Luaan Ok在术语上可能是一个错误的选择。基本上,使用static仍然可以执行MyStaticBleh=newmyclasshere();。不能将NEW与singleton一起使用,因为构造函数应该是私有的。静态类没有公共构造函数。我真的不知道你想在这里指出什么:注意,没有人谈论静态字段——这可能是这里的困惑。我会提供我通常的建议——设定性能目标,编写清晰易懂的代码,然后衡量性能。只有当代码没有达到目标时,您才应该调查和隔离性能问题所在,并开始考虑替代方案。不要试图学习10亿条编写“高性能”代码的规则,在这里,不要仅仅因为“代码就是这么做的”——他们这样做是出于特定的原因和特定的规模——你的情况可能与他们的情况相同吗?