C# 从方法/事件实例化具有外部可访问性的类

C# 从方法/事件实例化具有外部可访问性的类,c#,C#,我有一个类游戏,它不能为了序列化而被设置为静态。我想从一个方法实例化Game,并在代码中的其他地方访问新实例 如果我尝试这样做: public void btnNewGame_Click(object sender, EventArgs e) { Game game = new Game(); } 新实例在此方法之外不可用。有没有办法在方法中实例化游戏,并在其他地方访问该实例?或者有什么解决办法吗?问题是,我不希望在单击此按钮之前实例化Game 任何建议

我有一个类
游戏
,它不能为了序列化而被设置为静态。我想从一个方法实例化
Game
,并在代码中的其他地方访问新实例

如果我尝试这样做:

    public void btnNewGame_Click(object sender, EventArgs e)
    {
        Game game = new Game();
    }
新实例在此方法之外不可用。有没有办法在方法中实例化
游戏
,并在其他地方访问该实例?或者有什么解决办法吗?问题是,我不希望在单击此按钮之前实例化
Game


任何建议都将不胜感激。

具有惰性实例化的单例模式是您的朋友


查看一个示例。

您可以创建一个静态属性,返回唯一存在的
Game
对象。例如:

public class Game
{
    private static Game instance;
    public static Game Instance
    {
        get
        {
            if (instance == null)
                instance = new Game();
            return instance;
        }
    }
}
然后像这样使用它:

Game theOneAndOnlyGame = Game.Instance;
Game theOneAndOnlyGame = MyGameEngine.Game;

或者,如果您无法更改
游戏
类:

public static class MyGameEngine
{
    private static Game game;
    public static Game Game
    {
        get
        {
            if (game == null)
                game = new Game();
            return game;
        }
    }
}
然后像这样使用它:

Game theOneAndOnlyGame = Game.Instance;
Game theOneAndOnlyGame = MyGameEngine.Game;

单例可以被序列化而没有任何问题吗?是的。singleton只是一个带有正则字段的正则类,只有使用magic才能确保它只有一个实例,并且该实例可以在代码中的任何位置访问。:)我来玩玩这个。我想我唯一关心的是,如果实例已经处于活动状态(即,如果播放机从暂停屏幕加载旧的保存),则进行反序列化。我想我们拭目以待吧。在这种情况下,您必须编写一个专门的setter,我想这不是每个人都可以调用的。顺便说一句,我给出的模式不是线程安全的。为什么不在方法外创建一个静态游戏,并在方法内实例化游戏,然后生成_Game=Game。这样你就可以拥有一个静态的变量来保存游戏的实例。考虑将“代码”>游戏/代码>的“可序列化”属性移动到一个单独的<代码> GAMStAs< /Cord>对象。序列化/反序列化
游戏状态
,并使用一个方法
Game.LoadFromState(GameState)
,该方法将读取/分配任何适用的数据。这样,集中式的
游戏
类可以是静态的(如果您需要的话),并且可以存储不可序列化的内容;也许更重要的是,保存/加载机制可以抽象为从不同位置(数据库、文件系统等)存储/读取,或者更好地保持与稍旧版本的游戏的向后兼容性。@ChrisSinclair感谢您的提示。我会去做的。