3

我目前正在用 C# 做一个带有大量渲染的项目,并且在几乎所有的类中,都有一个整数类型的常量值用于缩放渲染。我知道我可以在一个地方将此常量定义为普通变量,然后将其传递出去,但这似乎很麻烦。什么时候可以在 C# 中使用静态变量?解决我的问题的最简单方法是创建一个包含所有其他类都可以引用的静态变量的类——这会是糟糕的设计吗?

4

5 回答 5

8

值有多恒定?static对于有 的事情很好,但如果不是readonly,你很快就会陷入混乱- 特别是如果你有多个线程。缩放因子对我来说听起来并不像一个硬常数 - 即它不是: readonly

public const double ScaleFactor = 1;

我会毫不犹豫地为我加载一次的东西使用静态变量,然后不理会。除此之外,我可能会(在你的情况下)RenderContext用这个值和任何其他实用程序方法封装某种类型 - 并传递RenderContext方法之间的方法;如果您需要进行单元测试等,这也可以帮助您从底层实现中抽象出来。

当你发现你需要更多的属性(你不可避免地会)时,你只需扩展RenderContext类 - 没有其他改变。


(编辑)

另外——考虑一下未来:你会一次做多个渲染吗?因为我们现在都有很多内核,等等......如果所有线程共享一个值,静态是好的。有[ThreadStatic],但相比之下有点混乱。

于 2009-06-02T23:09:06.677 回答
7

一点也不差的设计。事实上,拥有一个公开静态方法和静态值的 Common 或 Utility 命名空间和类将这些值集中在一个地方,这样您就可以确保应用程序中的每个模块都使用适当的值。这是低凝聚力,但可以接受的好处。我看没有问题。

于 2009-06-02T23:07:30.720 回答
6

不,这实际上是静态变量的完美候选者。您甚至可以更进一步,将类设为静态,使其无法实例化。然后,您可以将所有常量以及必要时的一些辅助方法添加到该类。

于 2009-06-02T23:07:10.487 回答
2

答案是,如果程序有效且可维护,那就去做。

静态变量不是罪,知道何时使用它们是件好事。:)

于 2009-06-02T23:08:55.710 回答
1

如果你所有的类都必须理解这个值+做其他事情,那么(除非它像 pi)你可能应该检查你的类是否有一个问题。也许这个“价值”需要成为一个可以执行当前在整个代码库中执行的操作的对象?

于 2009-06-02T23:11:32.320 回答