静态类的静态方法与非静态类的静态方法 (C#)
Posted
技术标签:
【中文标题】静态类的静态方法与非静态类的静态方法 (C#)【英文标题】:Static Method of a Static Class vs. Static Method of a Non-Static Class ( C# ) 【发布时间】:2011-01-17 01:33:20 【问题描述】:我在一次采访中被问到上述问题。你能解释一下不同之处吗? (性能-内存-使用-什么时候用哪个?)
谢谢,
尔康
【问题讨论】:
【参考方案1】:在决定是使用具有所有静态方法的普通类还是使用静态类时,我面临的一个主要区别是普通类支持接口实现,而静态类不支持。 只有当我确定它是静态函数(通常是辅助函数)的集合,并且永远不会出现在程序的主流中时,我才使用静态类。我提倡接口编程,用于依赖注入、单元测试等。因此,对于程序的主要流程,我使用带有静态方法的普通类。
参考:MS Docs
【讨论】:
【参考方案2】:在内存方面,略有不同:非静态类中的静态方法仅在该类型的第一个实例被创建时才被分配,而在该类型的最后一个实例被释放时被释放。当我们拥有相同类型的对象集合以减少使用的内存量时,实例对象上的静态方法非常有用。使用静态方法的缺点是它们不能进行单元测试,因此在创建静态方法之前,应密切注意它将如何影响代码覆盖率。
【讨论】:
【参考方案3】:当您提供实用功能并且您的所有方法都是静态的时,我建议您在静态类中使用静态方法。
当您想提供只处理您的实例的实用方法时,我建议您在非静态类中使用静态方法。例如:
var myClass = MyClass.Create();
var myClass = MyClass.Parse("serialized.MyClass");
【讨论】:
【参考方案4】:声明一个静态类记录了您将该类作为静态功能集合的意图,任何添加实例成员的人都会遇到编译错误。
具有静态成员的非静态类通常表明该类被设计为在某个时刻被实例化。这些类的静态方法通常做以下两件事之一:
-
提供用于创建该类型实例的工厂方法;
提供不需要类型实例的辅助功能;
另外,如前所述,扩展方法只能在静态类上声明。
【讨论】:
【参考方案5】:我假设你被问到差异?
静态类上的静态方法可用于定义扩展方法。非静态类的静态方法不能。
【讨论】:
这是一个宽泛的答案,只与 C# 相关。 @Nathan 这个问题特别提到了 C#,所以是的 请问扩展方法的例子是什么?【参考方案6】:在性能和内存使用方面;完全没有。拥有一个静态类意味着您知道没有实例,但在 1.1 中拥有一个私有构造函数就足够了。如果拥有实例根本没有意义,请使用静态类! (实用程序类等)
【讨论】:
以上是关于静态类的静态方法与非静态类的静态方法 (C#)的主要内容,如果未能解决你的问题,请参考以下文章