Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类引用快捷方式_C#_Class - Fatal编程技术网

C# 类引用快捷方式

C# 类引用快捷方式,c#,class,C#,Class,我目前在我的项目中有两个解决方案。 解决方案1是游戏引擎 解决方案2本质上是前端冒险 为了从GameEngine库中访问类,使用了单例设计方法,因此对于我来说,使用GameEngine.Instance.inventory访问我的清单类 但是,现在这是在添加大量代码,每次都执行GameEngine.Instance,是否有一种方法可以调用方法或返回,这样我就可以简单地引用Inventory,它将返回GameEngine.Instance.Inventory类?基本上是一条捷径 提前感谢:)一种方

我目前在我的项目中有两个解决方案。 解决方案1是游戏引擎 解决方案2本质上是前端冒险

为了从GameEngine库中访问类,使用了单例设计方法,因此对于我来说,使用GameEngine.Instance.inventory访问我的清单类

但是,现在这是在添加大量代码,每次都执行GameEngine.Instance,是否有一种方法可以调用方法或返回,这样我就可以简单地引用Inventory,它将返回GameEngine.Instance.Inventory类?基本上是一条捷径


提前感谢:)

一种方法是设置属性:

public GameEngine.Inventory Inventory
{
    get { return GameEngine.Instance.Inventory; }
}
private static GameEngine.Inventory _inventory;
public static GameEngine.Inventory Inventory
{
  get { 
    if (_inventory == null) {
       _inventory = GameEngine.Instance.Inventory;
     } 

     return _inventory;
  }
}
现在,您可以在整个类中使用
Inventory
来引用您的单例对象。但是,这只在特定类中有效


此外,根据@Leri的评论,这可能(也可能不会)影响性能。

如果您的singleton实例从未更改,您可以安全地为该实例使用一个变量:

var i = GameEngine.Instance;
然后将其用于:

i.Inventory
使用静态属性:

public GameEngine.Inventory Inventory
{
    get { return GameEngine.Instance.Inventory; }
}
private static GameEngine.Inventory _inventory;
public static GameEngine.Inventory Inventory
{
  get { 
    if (_inventory == null) {
       _inventory = GameEngine.Instance.Inventory;
     } 

     return _inventory;
  }
}

您还可以添加一个静态方法,以便可以通过整个项目访问它

public static ClsInventory GetInventory()
{
   return GameEngine.Instance.Inventory;
}

我想补充一下答案。他们都正确地回答了你的问题,我对他们都投了赞成票。但是,我建议您不要使用单例,而是尝试将您的方法更改为向acces“全局”实例注入依赖项

如果要访问其他(全局)对象而不是库存,会发生什么?您必须向游戏引擎添加另一个属性。你的引擎将成为一个弗兰克斯坦,有很多属性属于游戏引擎内部实例。这违反了单一责任模式


此外,当你想对游戏进行单元测试时,你必须为每个测试/夹具设置整个游戏引擎。IOD还可以帮助您解耦代码。

@AD.Net:不,那不行
使用
别名对于类型很好,但这是一个表达式,具有两个属性getter。明白了,以前不理解它。您还可以使用ge=ApexCorp.Games.GameEngine将类型别名为
然后将其用作
ge.Inventory
,其中
Inventory
是一个静态属性。这会增加额外的方法调用,这会降低性能,在游戏中很明显。@Leri:编译器可能会内联这样的属性;这不太可能造成任何明显的影响。尝试此操作后,将继续获取错误。非静态字段、方法或属性的Adventure.Actions.PlayerItemInventory需要对象引用。get@Kehza,这取决于你怎么称呼这个属性。你可能需要申报static@Leri
Instance
Inventory
也是两个查找,可以是一个。无论哪种方式,对于性能关键的情况,我们都可以先将引用复制到局部变量。请注意,通过缓存该值,您假定
GameEngine.Inventory
字段永远不会更改。。。如果是这样的话,那么这很可能只是一行静态字段:
publicstaticreadonly GameEngine.Inventory=GameEngine.Instance.Inventory虽然IoC通常是良好的设计实践,但将其用于游戏引擎可能会产生不必要的性能影响。这取决于您在哪里使用它。在给定的示例中,播放机按下一个按钮,库存就会出现。国际奥委会损失了多少米?由于渲染引擎中没有使用,这有关系吗?如果不了解完整的游戏架构,很难准确地说,我的评论更多的是作为脚注而不是批评。您也可以(也应该)具有静态属性。;)