C# 最好是有一个公共只读对象,每个类有相同的本地只读对象,还是直接引用库对象?

C# 最好是有一个公共只读对象,每个类有相同的本地只读对象,还是直接引用库对象?,c#,C#,我正在使用XNA中的C#构建一个游戏,我不确定这四种方式中哪一种最好只用于阅读访问: 有一个公共静态变量,每个类都可以通过调用Game.Viewport访问该变量(Game是主类: 公共静态只读视口=GraphicsDevice.Viewport 使用中: rectangle = new Rectangle (Game.Viewport/2, ... rectangle = new Rectangle (viewport/2, ... rectangle = new Rectangle (v

我正在使用XNA中的C#构建一个游戏,我不确定这四种方式中哪一种最好只用于阅读访问:

  • 有一个公共静态变量,每个类都可以通过调用Game.Viewport访问该变量(Game是主类:

    公共静态只读视口=GraphicsDevice.Viewport

  • 使用中:

    rectangle = new Rectangle (Game.Viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
  • 具有一个局部变量,该变量引用每个需要视口的类的视口:

    私有只读视口=GraphicsDevice.Viewport

  • 使用中:

    rectangle = new Rectangle (Game.Viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
  • 使用传递到需要视口的每个类的构造函数中的局部变量(这将是唯一不需要导入Microsoft.Xna.Framework.Graphics的类):

    私有只读视口

  • 然后在构造函数中:

    viewport = pViewport;
    
    使用中:

    rectangle = new Rectangle (Game.Viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
    rectangle = new Rectangle (viewport/2, ...
    
  • 在需要(正在使用)视口的任何地方,直接从类库中引用视口:

    矩形=新矩形(GraphicsDevice.Viewport.Width/2

  • 我想知道哪种方法在速度方面最好,哪种方法在可读性方面最好。就我个人而言,我觉得第四种方法最简单、最快,所以我不需要创建任何对视口的引用,很明显,我指的是全局性的东西。它似乎在剔除“中间人”,但随后必须将XNA图形库导入到使用视口的每个类中


    你们觉得怎么样?

    我想这取决于你们的设计。如果这只是一个简单的一次性应用程序,我会使用你们的第一个例子。你们只有一个视口,你们的类都不依赖于
    图形设备,也不依赖于管理该视口的方式

    将单个对象存储在那里并在代码中引用它会很快;它只是一个字段引用,所以它们不会比这个快很多。每次调用
    GraphicsDevice.Viewport
    ,尤其是因为它是一个属性,这意味着您每次要访问它时都要运行一个属性getter方法

    编辑:如果您想在
    Game.Viewport
    (而不是字段)上快速插入属性包装器,以便可以临时跟踪访问(比如日志记录),那么您可以这样做。如果您使用
    GraphicsDevice.Viewport
    ,选择后者,您必须在代码中调用它的每个地方都进行(代码重复)

    如果这是为了一个更可重用的库,如果将对视口的访问限制为只访问相关类是有意义的,或者希望将对
    游戏的依赖项分离,那么通过构造函数将其作为依赖项注入传递是值得的,尤其是在单元测试方面


    我甚至不考虑选项2(评估代码>图形设备。Viewport < /COD>每个类作为一个私有字段)。至少你可以用自己的可重用静态类(你正在做的代码<游戏> /COD>)来包装它。

    您的问题意味着在类文件的顶部键入
    与使用Microsoft.Xna.Framework.Graphics
    相关的开销很大。这种开销在设计时很小,在编译时可以忽略不计,在运行时为零。@phoog Ahh,所以我的问题是使用对Xna库中属性的引用(或任何图书馆),类似于引用该属性的类声明中的私有字段,比在需要时直接调用该属性慢?答案取决于调用特定属性的成本。属性是get方法和/或set方法的语法糖,因此调用属性的成本可以任意大实际上,大多数属性包装一个私有字段;这些调用可能由JIT编译器内联,从而使成本为零。如果对此类属性getter的调用未内联,则成本仍然可以忽略不计。标准建议是评测应用程序,并且仅在发现对属性getter consu的调用时缓存属性值给我提供了大量的资源。感谢您的全面响应!因此,如果我使用第一个示例,其中我有一个公共视口引用,每次调用该引用时,调用该引用不会简单地告诉它每次调用属性getter方法吗?同样,这是否意味着properties比字段有更多的开销,因为它们需要运行getter/setter方法?如果是
    readonly
    字段,那么就没有属性getter开销。一般来说,属性的开销通常可以忽略不计;如果不能使用
    readonly
    字段并希望公开数据,那么使用getter和通常情况下,如果你正在进行一些严重的性能调整(这可能适用于一场比赛),你只想修剪掉它,但这很少,很少,很少是性能问题的原因。