当我创建实用工具类时,我通常会创建一个具有私有构造函数的类,并将其所有方法和属性公开为静态类。这是最好的方法是什么?我做什么或创建一个静态类有什么区别?静态等级VS.具有私有构造函数和所有静态属性和方法的类?
20
A
回答
23
静态类被自动封闭,所以人们不能继承和重载他们的行为。
这是唯一的真正的区别(除非有一些特别的东西在IL)
所以如果你使用一个静态类,你救自己制作的构造私人,并宣布密封类的麻烦。
我想补充一点,定义一个类为static,是“自我记录”的代码。你的库的用户将知道这个类不应该被实例化,并且只有静态值。
17
静态类永远不能实例化。没办法,没有办法。
非静态类与私有构造函数,但所有的静态方法可以以多种方式被滥用 - 继承,反射调用私有构造的静态工厂 - 实例化的类。
如果你永远不想实例化,我会去静态类。
编辑 - 澄清了FosterZ的评论
说你有这个工具类:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public static int Negate(int x) { return -x; }
private Utility() { }
}
如果另一个开发人员不在其意图明确,他们可以这样做:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public int Config2 { get; set; }
public static int Negate(int x) { return -x; }
private Utility() { }
/// Get an instance of Utility
public static Utility GetUtility()
{
return new Utility();
}
}
现在你有一个Frankenstei n级。它的一些功能需要实例化,有些则不需要。也许这就是你想要的,但也许不是。您可以通过代码审查来防止这种情况,但为什么不在代码中明确表达意图?将课程标记为static
可消除任何可能的混淆。您不能实例化静态类或从中继承。
15
除了以前的答案:编译器将不允许在静态类非静态成员,并产生和错误。这可能会有助于不偶然地添加非静态成员。
1
我也要去与私有构造函数永远不会被静态方法调用。所以在那里的任何初始化都会浪费......但这只是一个理论。
3
可以传递具有私有的构造函数作为参数传递给任何方法的类的对象,但你不能做同样的静态类。这是主要区别。
相关问题
- 1. 使用私有构造函数和私有静态方法调用类?
- 2. xUnit runner如何处理具有静态类构造函数的静态方法?
- 3. 具有静态方法的静态类和具有静态方法的常规类之间有什么不同?
- 4. 具有静态和非静态重载的类方法
- 5. 有关静态构造函数,方法和字段
- 6. F#私有静态方法
- 7. iOS静态库私有方法和属性
- 8. 静态构造函数有用
- 9. 类设计:公共构造函数或私有静态工厂和COM对象
- 10. 构造函数和静态函数
- 11. 通过静态和非静态方法访问静态属性?
- 12. 非静态类中的静态方法和静态类中的静态方法有什么区别?
- 13. Javascript中的私有构造函数与静态成员
- 14. 为什么私有静态属性为
- 15. 静态对象如何调用私有构造函数
- 16. 静态方法和非静态方法有什么区别?
- 17. javascript中的私有静态函数
- 18. 静态和默认构造函数
- 19. Assembly.GetCallingAssembly()和静态构造函数?
- 20. 静态类和静态方法
- 21. 如何描述没有构造函数和静态方法的c#接口?
- 22. Hibernate和Spring交易 - 使用私有构造/静态工厂方法
- 23. Zend和静态类属性
- 24. 使用私有静态方法
- 25. 私有静态方法问题
- 26. 将具有静态属性和注解的Java类翻译为Scala等效
- 27. 静态构造函数和私有构造函数之间的主要区别是什么?
- 28. 构造函数链和静态属性参数和结构映射
- 29. PHP的静态属性和方法
- 30. Java - 静态构造函数
在IL中确实有一些特殊的东西。静态类标记为抽象和密封(这不能从C#完成),这绝对阻止了实例化。 – 2008-11-27 09:59:08
请注意,根据Mehrdad([here](http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927#5241927)),另一个区别是非静态类的静态方法不能作为扩展方法。 – Benjol 2011-06-01 06:20:20