如何决定C#静态和非静态方法?

[编辑]

我的原始问题是“为什么要在静态和非静态之间决定?

不幸的是,它被编辑为一个C#特定的问题,我真正想避免的.

所以,让我做一些补充:

当我说界面时,我不是指C#-keyword界面,而是我所理解的东西就像一个C界面:一组定义明确的函数来操作我的对象.
当说我的界面削弱时,我的意思是我有不同的功能(静态/非静态)做同样的事情.当有不同的功能做同样的事情时,我的界面不太明确.

所以,作为Janitor发布的Bob,我可以实现一个Validate()函数

Document.Validate(myDocumentObject);    

但也

myConcreteDocumentObject.Validate();

要回到我的Copy() – 例如,可以实现Copy()像

myConcreteDocument.Copy(toPath);

但也

Document.Copy(myConcreteDocumentObject, toPath)

要么

Document.Copy(fromPath, toPath)

当我想到一个包含所有属于我的文档的文件的文件夹(在这种情况下,我不依赖于一个具体的实例 – 但是我依赖于其他的东西:)).

一般来说,我正在谈论静态方法而不是静态类(对不起,如果我忘记了).

但是安东·戈古列夫说,我认为我的文件课不是一个很好的例子,没有很好的设计,所以我想我将看看单一的责任原则.

我也可以实现与我的DocumentClass一起使用的一些ManagerClass:

例如:

myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);

要么

myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);

但是如果我提到方法1)我会倾向于创建自己执行任务的对象,而不是使用我的DocumentObject执行某些操作的其他对象(DocumentManager).

(我希望这不会采取关于OOP的宗教讨论的方向))

[/编辑]

旧版:

起初这似乎是一个非常基本的问题,例如“何时使用静态方法,何时不使用”,但这是我每次面对的东西(我有困难来描述真正的问题是什么;也许只是为了获得原因(不)使用1)或为什么(不)使用2)).

(虽然我使用C#-Syntax这不是一个C#限制的问题)

在OOP中,使用对象有两种方法(其中包括):

1)如果我想要我的对象做某事,我只是告诉他这样做:

myConcreteObject.DoSomething();

就像对对象说话.

2)或者如果你是静态方法的粉丝:

ObjectClass.JustDoIt();

在某种程度上,我认为静态功能只是“感觉”更好.所以我倾向于常常使用静态方法(独立于具体实例 – 独立性总是好的).

所以,在设计一个班级时,我经常需要决定是否采取方法1)或方法2):

想象一下,您有一个类“文档”,它应该代表应该保存到数据库中的文档:

文件

>由文件系统中的一个或多个图像文件组成(这些成为单个文档页面)
>有一些参考书目 – 用户可以添加有关文档的信息 – 这被保存到一个额外的文件
>并且应该有一些操作像Copy(),AddPage(),RemovePage()等.

现在我用几种方式来创建这个类:

//----- 1) non static approach/talking to objects -----
Document newDocument = new Document();

// Copy document to x (another database, for example)
newDocument.Copy(toPath);

我喜欢这样:我告诉文档将自己复制到数据库x,对象本身就这样做.尼斯.

//----- 2) static approach ----------------------------
Document.Copy(myDocumentObject, toPath);

为什么不?还不错,感觉很方便…

那么,哪一个要实现?都?还是把静态方法放到一个帮助类中?或选择方法1)坚持不要削弱我的文档类的界面?

当考虑两种方法时,我得出结论(理论上讲)可以实现任何函数作为静态函数:

Class.Function(aConcreteClassObject, parameters);

也是非静态的:

aConcreteObject.DoSomething(parameters);

给一个真实的例子:

[编辑(添加参数fromPath“对不起,我忘了”)]

//----- 2) static approach ----------------------------
File.Copy(fromPath, toPath);    // .Net-Framework-like

[/编辑]

但也:

//----- 1) non static approach ------------------------
ExampeFileClass fileObject = new ExampleFileClass();
fileObject.Copy(toPath);

甚至(一种OOP-Overkill):

//----- 1) non static approach, too -------------------
fileObject.ToPath = @"C:\Test\file.txt";     // property of fileObject
fileObject.Copy();                           // copy to toPath

那么,为什么(不)使用1)或为什么(不)使用2)?

(我不会专注于Document类的例子太多,因为它更像是一个关于好的类设计的一般问题.)

吻.如果你不必打电话给构造函数,甚至更好.

另外,静态的方法应该告诉你一些关于函数的操作:

>它不会对传递给它的变量进行操作.
>除了调用该方法之外,它不需要任何内存(不计算从函数返回的内容)

还有一些其他重要的事情要注意:

>在某些实例(Java)中的静态方法不能被覆盖/子类化,所以它们更适合实现不需要更改的情况.
有人会认为静态方法是intrinsically difficult to test.

我也会提到这个thread和一个simple google search,坦率地说就这个话题进行了大量的讨论.

翻译自:https://stackoverflow.com/questions/798036/how-to-decide-between-c-sharp-static-and-non-static-methods

转载注明原文:如何决定C#静态和非静态方法?