所以我想把所有重要变量外包给一个新类。 展示我正在尝试做的一个非工作的例子是:

public class GameState{
    public bool ToggleA{ get; set; }
    public bool ToggleB{ get; set; }
    public int a{ get; set; }
    public int b{ get; set; }
}

一旦设置了值并使所有内容都引用同一个实例,我怎么能“保持这个类活着”? 我的谷歌搜索引发了我的单一模式( 链接 ,然而这并没有带给我更多,要么我不明白如何正确地实现我想要做的事情,在这种情况下,一个深入的例子将是整洁的,或者我需要使用别的东西?

===============>>#1 票数:2

使它成为一个静态类。

public static class GameState ...

静态类只有一个实例。 你没有new 您可以通过类名访问它们:

GameState.ToggleA = true;
DoStuff(GameState.b);

等等

您的每个属性也必须是静态的:

public static bool ToggleA {get;set;} ...

在这种情况下,静态类基本上等同于Singleton模式。

===============>>#2 票数:1 已采纳

实现这一点的最佳方法是使用单例设计模式。 它将允许您的代码保持可测试性。

给出以下界面:

public interface IGameState
{
  bool ToggleA { get; set; }
  bool ToggleB { get; set; }
  int A { get; set; }
  int B { get; set; }
}

以下是它的单例实现:

public class GameState : IGameState
{
  // This instance variable will only ever have one copy instantiated
  private static GameState _instance = new GameState();

  // Private constructor so the class cannot be instantiated outside of the class.
  // This ensures that no other class can create an instance of the class.
  private GameState() { }

  public static GameState Instance { get { return _instance; } }

  public bool ToggleA { get; set; }
  public bool ToggleB { get; set; }
  public int A { get; set; }
  public int A { get; set; }
}

您现在可以在需要的地方注入此单例,这将保持代码的测试能力。

public class SomeObject
{
  private IGameState _gameState;
  public SomeObject(IGameState gameState)
  {
    _gameState = gameState;
  }

  public void SomeOperationOnGameState()
  {
    _gameState.ToggleA = true;
  }
}

编辑:更新以解释测试相关的评论

想象一下,您的GameState对象演变有一个复杂的方法来执行计算,并且您希望确保在必要时调用此方法。 如果您使用的是全局静态类,则无法验证此行为。 如果您正在编程接口,但是您可以使用模拟框架模拟这种依赖关系,并验证确实调用了复杂方法。

例如,我们将IGameState接口扩展为以下内容:

public interface IGameState
{
  bool ToggleA { get; set; }
  bool ToggleB { get; set; }
  int A { get; set; }
  int B { get; set; }

  int ComplexStateAlteringMethod();
}

现在假设您有某种Controller类,它管理按键操作:

public class Controller
{
  private IGameState _gameState;
  public Controller(IGameState gameState)
  {
    _gameState = gameState;
  }

  public void KeyPressed(string key)
  {
    // Implementation details go here, say you want to call the complex method when the 'A' key is pressed
    if (key == "A")
    {
      _gameState.ComplexStateAlteringMethod();
    }
  }
}

您希望确保在按下“A”键时调用IGameState.ComplexStateAlteringMethod()

在不解释IGameState ,我将创建一个Stub IGameState

public class StubGameState : IGameState
{   
  public bool ToggleA { get; set; }
  public bool ToggleB { get; set; }
  public int A { get; set; }
  public int B { get; set; }

  public bool WasStateAlteringMethodCalled { get; private set; }
  public void ComplexStateAlteringMethod()
  {
    WasStateAltermingMethodCalled = true;
  }
}

现在你可以使用这个存根类来验证你正在寻找的行为(假设NUnit是测试框架):

[TestFixture]
public class ControllerTests
{
  [Test]
  public void KeyPressed_WhenAIsPressed_ShouldCallStateAlteringMethod()
  {
    // Arrange
    var stub = new StubGameState();
    var controller = new Controller(stub);

    // Act
    controller.KeyPressed("A");

    // Assert
    Assert.IsTrue(stub.WasStateAlteringMethodCalled);
  }

  [Test]
  public void KeyPressed_WhenBIsPressed_ShouldNotCallStateAlteringMethod()
  {
    // Arrange
    var stub = new StubGameState();
    var controller = new Controller(stub);

    // Act
    controller.KeyPressed("B");

    // Assert
    Assert.IsFalse(stub.WasStateAlteringMethodCalled); 
  }
}

  ask by user3488765 translate from so

未解决问题?本站智能推荐:

2回复

C#线程未设置其他类的变量值?

这是我的测试代码: 我希望能够通过线程设置“ testV”值。 它看起来像Thread确实设置了值,但是当从main方法中检索testV值时,它什么也没有。 这是为什么?
1回复

无法访问参数化构造函数变量值的变量值

我有一个像下面这样的参数化构造函数。 然后我有如下按钮事件处理程序。 因此,当我执行此操作时,当出现消息框时,它什么也没有显示为空白。 有什么错误? 我调试了代码,发现构造函数具有值,但消息框未获取值,它为null。
3回复

获取标签中的javascript变量值

我无法在标签中获取JavaScript变量值。 我正在Windows应用程序中尝试。 无法使用隐藏字段获取变量的值。 我试过下面的代码,但标签中没有值。 我尝试了所有答案,但在label3中没有任何价值。 我正在将JavaScript注入网页,并试图获取函数结果。
5回复

相同的变量名称 - 2个不同的类 - 如何将值从一个复制到另一个 - 反射 - C#

没有使用AutoMapper ...(因为当他们看到依赖项时,负责这个项目的人会打砖块) 我有一个类(A类),但有很多属性。 我有另一个类(B类)具有相同的属性(相同的名称和类型)。 B类也可能有其他无关的变量。 是否有一些简单的反射代码可以将值从A类复制到B类? 越简单越
2回复

来自另一个类的列表框计数项始终为0

当我在Frm中做同样的事情时,我得到了所选项目的实际数量,这是Frm中的代码 从我的程序我试图在登录过程中同时在facebook上发布多个组,用户选择他/她想要发布到listBox2中litBox1的组名称,其中有组ID(s)相同的顺序,所以当用户点击btnPostText我将选择从l
2回复

根据另一个指定的通用类型推断通用类型并使用它

首先,我想指出的是,我已经有了一个可行的解决方案,但是我试图看看是否有一种方法可以使代码更简洁,更省力。 这是我的情况。 实际上,我已经简化了情况,并创建了一个伪造的示例以使插图清楚。 我将要提出一个具体的示例,说明我已经完成的工作,并且它可以工作。 假设我们有这些类:
2回复

在两个实例完全相同的时间创建一个StreamReader / FileStream,引发异常File正在被另一个进程使用

我正在基于FileWatcher事件在网络位置读取文本文件。 我有同一程序的两个实例读取文件,当实例1和实例2在完全相同的秒和毫秒处读取文件时,我得到一个异常,说明文件正在由另一个进程使用。 如果实例1和实例2之间存在几毫秒的差异,则不会出现此锁定错误。 我尝试过的事情 1.尝试使用F
1回复

Autofac使用不同的参数解析相同的类实例

我有一个Xamarin.Forms应用程序,正在使用Autofac进行DI。 所以我想要的很简单,但是我无法做一些看起来像是在做的事情。 因此,我有一个包含两个构造函数的类,它们两个都有一个参数,并且基于某些条件,我想解析其中一个。 例如,我有一个类A,我想要的基于条件B或C的问题
1回复

对许多表使用与控制器相同的类

我是asp.net和天青的移动服务新手。 有一些问题: 1)我已经使用TodoItemController从蔚蓝表存储中查询数据(只是使用了下面给出的示例类)如何修改它以使其充当所有表的泛型类而不仅仅是一个表的泛型类。例如:除了Todo外,我还有另一个叫person的表,我希望它对两
4回复

两个线程使用相同的变量会产生问题

我有一个列表和两个使用该列表的线程。 第一个线程获取新连接,每个新连接都添加到列表中。 第二个线程在List上循环以处理连接(使用foreach)。 问题在于,有时当第二个线程在列表上循环时,列表​​会在循环结束之前更改。 我什至尝试创建列表的新副本并遍历它。 但这还会产生