【发布时间】:2010-07-27 20:53:51
【问题描述】:
对于程序集中可以拥有的静态函数的数量是否有任何经验法则?
你如何识别一个函数是否需要是静态的和一个不需要是静态的函数?
【问题讨论】:
标签: .net architecture static assemblies frameworks
对于程序集中可以拥有的静态函数的数量是否有任何经验法则?
你如何识别一个函数是否需要是静态的和一个不需要是静态的函数?
【问题讨论】:
标签: .net architecture static assemblies frameworks
嗯,没有经验法则 - 归结为设计论点。如果您要听 FxCop,如果方法不适用于类的实例成员,则该方法可以成为静态方法...
我更喜欢采用古老的定义,如果方法在类型之间共享而不是特定于类型的实例,则该方法应该是静态的。
此链接包含“何时使用”部分:
http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
【讨论】:
一般来说,随着提供对组件的生活方式控制的 DI 和 IoC 容器的出现,我尽量将static 的使用保持在绝对最低限度。使用由 IoC 容器管理的“单例”组件,静态类和/或函数的价值和使用将减少到消失的水平。
也就是说,在程序集中可以拥有多少静态类型或成员并没有真正的限制。一个类型的静态成员由 CLR 存储在称为加载程序堆的东西上,而不是普通的 GC 堆,这些堆开始时相当小(我相信大约 32k)。鉴于此,它可能需要数千个静态类和/或填充加载程序堆的方法。
以下是我仍然使用静态成员或类的少数几种方式:
[ThreadStatic] static 必须提供线程单例行为的类中使用的字段ConfigurationSection、ConfigurationElement 等。
[ConfigurationProperty()] 属性,虽然它会产生非常少量的额外开销,但它更简单且通常更简洁【讨论】:
Logger.Singleton.Log("Ok");。另一方面,我们可以编写一些静态传递方法来允许更自然的Logger.Log("Ok");"。这不是更好吗?
我认为经验法则是尽可能将其设为静态。换句话说,如果一个方法需要访问实例字段,那么它就不能是静态的。否则,应该是。
【讨论】: