关于C#:是否使用静态类

Whether to use static class or not

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to Use Static Classes in C#

我将编写只包含方法的类所需的代码。我认为让班级保持静止是个好主意。一些高级程序员认为不要使用静态类。我找不到任何不使用静态类的好理由。有人能用C语言知道使用静态类有什么危害吗?静态类的使用是否比创建类的对象需要更多的内存?我将澄清我的类没有单个字段,因此也没有属性。

为了进一步的信息,我还将解释代码。

我们的产品需要对图表设置进行XML处理。我们从类库中的XML文件中读取对象,该文件包含与图表相关的属性。现在我有两个层,第一层是产品二类库和XML相关操作。实际上,高级程序员需要独立的类来读写XML。我使这个班静止不动。

在另一种情况下,我有一类ChartData。在这个类中,我想要一些方法,比如轴线、图表系列是否有效。另外,图表的颜色是以argb格式存储还是以纯颜色名称存储。他们不希望这些方法在同一个项目中。现在我可以制作类静态或创建对象。


一个问题是,在某些情况下,静态测试可能比较困难(并非不可能)。


如果您的类不必管理状态,那么绝对没有理由不声明它是静态的。

在C中,有些类甚至必须是静态的,就像那些具有扩展方法的类一样。

现在,如果将来有可能它需要状态,那么最好不要将其声明为静态的,就像您随后更改它一样,消费者也需要更改他们的代码。


静态类的危险在于它们经常成为上帝的对象。他们知道的太多,做的太多,他们通常被称为"utilities.cs"。

另外,仅仅因为类只包含方法并不意味着不能使用常规类,而是取决于类的功能。它有州吗?它是否保留在您的方法中被修改的任何数据?


拥有静态类并不坏,但是可以让您思考为什么在那里拥有这些方法。要记住的一些事情:

如果方法管理您在项目中拥有的类的行为,您可以直接将这些方法添加到这些类中:

1
2
3
4
5
//doing this:
if(product.IsValid()) { ... }

//instead of:
if(ProductHelper.IsValid(product)) { ... }

如果方法管理您不能修改的类的行为,您可以使用扩展方法(到今天为止是静态的)。但它添加了句法糖分)

1
2
3
4
public static bool IsValid( this Product product ) { ... }

//so you can do:
if(product.IsValid()) { ... }

如果方法耦合到外部服务,您可能想使用虚拟方法使用非静态类来模拟,或者实现接口将允许您在需要使用实例时用模拟对象替换实例。

1
2
3
4
5
6
7
8
9
10
//instead of:
StaticService.Save(product);

//you can do:
public IService Service {get;set;}
...
Service.Save(product);

//and in your tests:
yourObject.Service = new MockService(); //MockService inherits from your actual class or implements the same IService interface

另一方面,在非静态类中拥有逻辑将允许您使用多态性,并用扩展行为的另一个实例替换实例。

最后,在非静态类中使用逻辑可以让您使用IOC(Control Control)和基于代理的AOP。如果你不知道这一点,你可以看看Srim.NET.NET,Unity,CARCH,NICATE等框架,只想给你一个你能做的例子:你可以让所有实现IsService的类记录他们的方法,或者检查一些安全约束,或者打开数据库连接并在方法结束时关闭它,EVE。不向类添加实际代码的RyTee。

希望它有帮助。


这取决于何时使用静态类。在一般情况下,当不需要管理状态时创建静态类。例如,math.cs或utility.cs——其中您有基本的实用程序功能——例如字符串格式等。

另一个您想要使用static的场景是,当您期望类不会被修改时。当系统增长时,你发现你必须修改这个静态类,那么最好删除静态关键字。如果不是这样的话,你会错过一些ood的好处——比如多态性、接口——例如,你会发现我需要在一个静态类中更改一个特定的方法,但是由于你不能重写一个静态方法,那么你可能需要用微小的更改来"复制和粘贴"。


Some senior programmer argue that do not use static class.

告诉他他是个受训者,甚至不是个大三的。简单。静态关键字存在是有原因的。如果您的类只有不保持状态的方法,并且这些情况存在,那么将它们放入静态类中是有效的。点。

Can someone knows in C# language there is any harm in using static class.

不。唯一有效的参数是您的设计被破坏(即类不应该是静态的并且保持状态)。但是如果你真的有不保持状态的方法——而且这些情况存在,比如"数学"类——那么对不起,这是一个完全有效的方法。没有否定。