2013-03-07 53 views
2

这只是为了满足我的好奇心。是否有这样做的其中一个比其他对于简单功能静态优于静态优势

public static void Save(Guid id, int a, string b) 
{ 
    //Save a and b to the database using PK id 
} 

OVER的任何区别或优势:

Guid ID {get; set;} 
int A {get; set;} 
string B {get ;set;} 

public void Save() 
{ 
    //Save A and B to the database using PK ID 
} 

编辑: 好一些背景:所以Web UI的JSON传递到静态页面的方法。 Page Method分析JSON并将新变量传递给其他DLL中的静态类。这然后使用实体框架来更新数据库。这个可以吗?

+0

我想你在示例中缺少一些状态 - 数据库连接或信息。我不认为你的第一种方法可能真的是静态的。 – 2013-03-07 22:42:24

+1

您现在对这个问题有七个不同的答案,其中许多答案是“取决于”或“我更喜欢”。有些人始终把它当作一个对象发誓。我还记得[Rich Hickey](https://twitter.com/richhickey)在谈论Java如何使用静态方法的所有方面(他继续创建[Clojure](http://clojure.org/) ))。我觉得很舒服,说这个问题没有“正确”的答案。另请参阅[关于程序员堆栈交换的这个问题](http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods)以获取更多想法。 – 2013-03-08 18:07:48

回答

0

真的,这取决于你所使用的方法的情况。

例如,如果你执行一个命令模式,你不想每次都实例化一个对象,静态方法可能会有用。

同样,如果你只是添加一些功能的类,真的没有任何意义使该方法静态。

这些意思都不是更好比其他。这仅仅意味着它们有不同的用途。枪是一个非常有用的工具包,但不是当你试图关闭电视时。看到我的观点?

+0

但是,如果我在一个类中有两个,那么如果一段代码设置了属性并称为非静态代码,并且另一段代码在参数中传递给静态代码,那么它们之间绝对没有区别?例如在性能(或其他)? – Neil 2013-03-07 22:39:07

+0

如果你设置字段,那么调用非静态方法,那么它可能会更慢,但我没有看到只是填充非静态方法的一些参数有什么问题。我看到你的问题。从逻辑上讲,静态方法可能会更快,因为您从不需要首先创建对象。总的来说,这会加快执行时间。 – christopher 2013-03-07 22:41:09

0

密封功能始终优先于未密封,因为JITTER可以(选择)内联前者。静态函数始终是密封的,所有密封类中的方法都是如此。但是,避免将属性复制到静态上也是优选的。

正如克里斯在上面所说的,你需要根据具体情况来决定。 99%的时间无关紧要,因为性能足够好,或者瓶颈在其他地方,所以请保持代码清洁。

+0

我不认为“密封”在这里是相关的。默认情况下,静态方法和实例方法都不是虚拟的。 (关键词:虚拟 - 你需要添加到(实例)方法签名参与多态性和“开封”你的功能) – 2013-03-07 23:42:07

+0

@Kirk:是的,回想起来,我的回答没有看起来那么深刻时间。 – 2013-03-07 23:49:32

0

这基本上是“OOP与结构编程的优势”。在你的情况下,数据库连接会有所不同:它可以是类的字段,并且你可以在构造函数中提供一次。如果需要的话,这些方法可以使用它。 使用静态方法,您需要提供参数中的所有内容,甚至包含始终相同的内容。

不依赖于对象内部状态的方法应该是静态的。

1

您提供的示例似乎表明您正在编写某种持久性API,为此我强烈建议使用可实例化的类。使用静态方法对于实用程序类来说是可以的,但是如果你使用静态方法,你会很快发现你的代码变得不可扩展和不可维护。

2

我绝对会更喜欢静态的实例方法。原因在于静态方法意味着您必须将全局可变状态引入到您的系统中。为了起作用,静态方法需要访问某种类型的数据库连接,并静态执行。

应尽可能避免全局可变状态。这是一个即将到来的bug farm,并且会阻碍你的代码库的未来变化(例如引入多个线程)。