何时使用静态变量?

何时使用静态变量?

问题描述:

我目前正在C#中进行大量渲染,并且在几乎所有的类中都有一个用于缩放渲染的类型整数的常量值。我知道我可以在一个地方定义这个常量作为一个普通变量,然后传递给它,但这看起来非常麻烦。什么时候可以在C#中使用静态变量?对我的问题最简单的解决方案是创建一个包含所有其他类可以引用的静态变量的类 - 这会是不好的设计吗?何时使用静态变量?

不坏设计可言。事实上,拥有Common或Utility命名空间和公开的静态方法和静态值的类将这些值集中在一个位置,这样可以确保应用程序中的每个模块都使用适当的值。它的内聚力很低,但可以从中受益。我看到它没有问题。

不,这实际上是静态变量的一个完美的候选人。你甚至可以更进一步,让这个类变成静态的,这样它就不能被实例化。然后,您可以将所有常量添加到该类以及必要时使用一些辅助方法。

的回答是,如果该程序运行和维护的是,做到这一点。

静态变量是不是一种罪过,这是刚刚好,知道什么时候使用它们。 :)

如何常数的值? static是罚款的事情上readonly,但你可以很快进入一个烂摊子,如果它不是readonly - 特别是如果你有多个线程。缩放因子听起来不像硬不断给我 - 即它不是:

public const double ScaleFactor = 1; 

我会毫不犹豫地使用静态变量的东西,我一次加载,独自离开。除此之外,我可能会封装(你的情况)某种RenderContext这个值和任何其他的实用方法 - 并通过方法之间的RenderContext;这也可以帮助你抽象掉从底层实现,如果你需要进行单元测试等

当你发现你需要更多的属性(和你将不可避免地),你只是延长RenderContext类 - 没有别的变化。


(编辑)

而且 - 考虑未来:你永远做一个以上的渲染一次?由于我们现在都有很多内核,所以如果所有线程共享一个值,那么static就是好的。有[ThreadStatic],但比较起来有点混乱。

+1

中使用const时要记住的唯一的事:当你重新编译你的组件,你改变的常量所有模块的价值,使用该常数,也应重新编译有正确的值。这可以避免使用静态只读。 – SACO 2012-08-15 12:48:20

如果所有的类都必须了解该值+做别的事情,然后(除非它是像圆周率),你应该检查你的类有一个单一的问题。也许这个'价值'需要成为一个对象,可以执行目前正在你的代码库中完成的操作?