静态类的静态方法与非静态类的静态方法(C#)的区别

63
我在面试中被问到上述问题。请您解释一下它们之间的区别(性能-内存-使用情况-何时使用哪个?)。
谢谢, Erkan
6个回答

68

声明一个静态类表明你希望该类是一个静态功能的集合,添加实例成员的人将会得到编译错误。

非静态类具有静态成员通常意味着该类被设计用于在某个时刻实例化。这些类的静态方法通常有以下两个作用:

  1. 提供一个创建该类型实例的工厂方法;
  2. 提供不需要该类型实例的辅助功能;

此外,如已经提到的,扩展方法只能在静态类上声明。


25

我假设你被要求解释它们的区别?

静态类上的静态方法可以用于定义扩展方法。而非静态类上的静态方法则不能。


这是一种非常笼统的回答,仅适用于C#。 - Nathan Taylor
9
@Nathan,问题明确提到了C#,所以没错。 - JaredPar
请举一个扩展方法的例子。 - variable

19

就性能和内存使用而言,两者没有区别。静态类意味着你知道没有实例,但在1.1版本中,拥有一个私有构造函数就足够了。如果没有实例根本没有意义,那就使用静态类吧!(例如工具类等)


8

当您提供实用函数时,所有方法都是静态的,我建议您在静态类中使用静态方法。

当您想提供仅处理实例的实用方法时,我建议您在非静态类中使用静态方法。例如:

var myClass = MyClass.Create();
var myClass = MyClass.Parse("serialized.MyClass");

1
当我决定是使用普通类与所有静态方法,还是使用静态类时,我面临的一个主要区别是普通类支持接口实现,而静态类不支持。
我仅在确定它将是一组静态函数(通常是辅助函数),并且永远不会出现在程序的主流程中时才使用静态类。我提倡接口编程,用于依赖注入、单元测试等。因此,对于程序的主流程,我使用带有静态方法的普通类。
参考资料:MS Docs

0
就内存而言,有一点不同:非静态类中的静态方法只会在创建该类型的第一个实例时分配,并在销毁该类型的最后一个实例时释放。当我们拥有相同类型的对象集合以减少所使用的内存量时,实例对象上的静态方法非常有用。使用静态方法的缺点是它们无法进行单元测试,因此在创建静态方法之前,应注意它将如何影响代码覆盖率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接