关于.net:使用VB.Net“共享”或C#“静态”类和方法时是否有任何性能或争用注意事项?

Are there any performance or contention considerations when using VB.Net “Shared” or C# “static” classes and methods?

我在WCF服务后面有一个C类库。库包含声明为静态的ClassA。这个静态类有一个方法method a,它接受一个字符串,并使用linq查询数据库中的字符串翻译,然后通过WebService将该字符串发送回客户机。

我的问题是在这种情况下使用静态类和静态方法是否是糟糕的设计。类和方法是否应该是非静态的,以便每个客户机因性能、争用或其他原因而获得自己的类实例?谢谢。


我个人对静态方法和类比某些人更宽容,所以我认为这要视情况而定。静态方法是否可重入且线程安全?那就没事了。否则它的规模可能会很小。

我看到的一个问题是数据上下文。对于静态方法,您可能没有对数据库连接的生命周期进行细粒度控制?另一种选择可能是将其设置为非静态类和方法,并在WCF服务的静态构造函数中对其进行初始化。这样,以后如果需要,您可以更容易地修改行为。

实际上,如果WCF服务中的静态构造器有任何失败的机会,比如说数据库有一秒钟是awol,那么它们是不好的。关键是它将允许在服务本身中进行更细粒度的控制。


我同意Thorarin已经回答的问题。我通常不会在静态类中看到任何危害,特别是当静态类只包含执行某些操作并返回结果而不涉及任何静态字段或属性的静态方法时。但是,一旦对其中任何一个进行了修改,这就可能意味着麻烦。(搜索,例如关于单例和并发性的任何讨论,请参阅此处。)

从性能上讲,从理论上讲,调用静态方法应该比调用非静态方法快一点(尽管对于所有实际用途来说,这可能永远不会有任何显著的区别),因为运行时不必传递this/Me指针,而且由于使用静态方法,肯定不会有ov虚方法调用产生的二胡。