我是否以正确的方式使用静电?

时间:2011-04-04 07:49:59

标签: c# xna static-variables

我正在编写一个XNA引擎,我将所有模型存储在List中。为了能够在整个引擎中使用它,我已经将它设为public static List<Model>,因此我可以从我开发的任何新类中访问它。它当然使获得模型列表真的很容易获得,但这是正确的用法吗?或者我会更好地在方法声明中传递变量吗?

5 个答案:

答案 0 :(得分:5)

在OOP中,通常建议避免使用静态方法和属性,除非您有充分的理由这样做。其中一个原因是,将来您可能出于某种原因希望有两个或更多此列表的实例,然后您将陷入静态调用。

静态方法和属性太僵硬了。正如Stevey所述:

  

静态方法同样灵活   花岗岩。每次使用一个,   你正在投入你的计划的一部分   具体。只要确保你没有   把你的脚塞进那里   你看着它变硬了。总有一天你   天哪,你会惊讶的   真的需要另一个实现   当然PrintSpooler类,和   它应该是一个界面,一个   工厂,和一套实施   类。 D'哦!

答案 1 :(得分:5)

对于游戏开发,我提倡“做最简单的事可能工作”。这包括使用全局变量(C#中的public static),如果这是一个简单的解决方案。你可以随时把它变成更正式的东西。 Visual Studio中的“查找所有引用”工具使这非常简单。

如果说,很少有情况下全局变量实际上是做某事的“正确”方式。因此,如果您打算使用它,您应该了解了解正确的解决方案。因此,您可以在“懒惰”和“编写好代码”之间做出最佳权衡。

如果您要制作全球性内容,则需要完全理解为什么这样做。

在这种特殊情况下,听起来你正试图尝试获取内容。您应该知道ContentManager会自动返回相同的内容对象,如果您多次要求它。因此,不要将模型加载到全局列表中,而应考虑通过Game类的ContentManager属性使public static类的内置Game可用。

或者,更好的是,有一种我更喜欢的方法,我觉得有点好:I explain it in the answer to another question。基本上,您在使用它们的类中创建内容引用private static,并将ConentManager传递给public static LoadContent函数。这将您对静态的使用划分为单个类,而不是使用从您的整个程序中访问的全局(这将很难在以后解脱)。它还可以在正确的时间正确处理加载内容

答案 2 :(得分:1)

我会尽量避免使用静态,随着时间的推移,你最终只会使用spaghetti code

如果在构造函数中传递它,则消除了不必要的依赖关系low coupling is good。依赖性越少越好。

答案 3 :(得分:0)

我建议实现一个封装模型列表的Singleon对象 看看MSDN singleton implementation

答案 4 :(得分:0)

这是一个平衡和权衡的问题。

当然,OOP纯粹主义者会说不惜一切代价避免这样的全局变量,因为它通过引入任何模块“开箱即用”的东西来破坏代码区域化,从而使得难以维护,更改,调试等

但是,我个人的经验是,只有当您是一个非常大的企业解决方案团队的一员,维护一个非常大的企业级应用程序时,才应该避免这种情况。

对于其他情况,将全局可访问数据封装到“全局”对象(或静态对象,同样的东西)中可以在很大程度上简化OOP编码。

您可以通过编写返回模型列表的全局GetModels()函数来获得中间立场。或者使用DI自动注入模型列表。

相关问题