C# 最好是有一个公共只读对象,每个类有相同的本地只读对象,还是直接引用库对象?
我正在使用XNA中的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
rectangle = new Rectangle (Game.Viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
rectangle = new Rectangle (Game.Viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
viewport = pViewport;
使用中:
rectangle = new Rectangle (Game.Viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
rectangle = new Rectangle (viewport/2, ...
你们觉得怎么样?我想这取决于你们的设计。如果这只是一个简单的一次性应用程序,我会使用你们的第一个例子。你们只有一个视口,你们的类都不依赖于
图形设备,也不依赖于管理该视口的方式
将单个对象存储在那里并在代码中引用它会很快;它只是一个字段引用,所以它们不会比这个快很多。每次调用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和通常情况下,如果你正在进行一些严重的性能调整(这可能适用于一场比赛),你只想修剪掉它,但这很少,很少,很少是性能问题的原因。