0

我是 C# 的初学者,我认为实例化和传递引用有一些基本的东西,我只是没有得到。

我试图让默认的 Program 类实例化 2 个其他类,一个名为 frmGameUI 的表单和一个名为 LocHandler 的类。如果这工作正常,LocHandler 将检查当前位置并分配 frmGameUI 的文本属性。由于某种原因,在 LocHandler 中设置属性的方法无法查看或获取我对我在 Program.xml 中实例化的 frmGameUI 的引用。我究竟做错了什么?

static class Program
{
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainUI());

        GameUI frmGameUI = new GameUI();
        frmGameUI.Show();
        LocationHandler LocHandler = new LocationHandler();
        LocHandler.InitializeRoom();
    }

这是 LocHandler 类:

class LocationHandler
{
    private string currentRoom = "LivingRoom";

    public void InitializeRoom()
    {
        if (currentRoom == "LivingRoom")
        {
            frmGameUI.btnLocation1.Text = "Bedroom";
            frmGameUI.btnLocation2.Text = "Kitchen";
            frmGameUI.btnLocation3.Text = "Patio";
        }
    }
}

在 LocHandler 中,VS 告诉我 frmGameUI 在这种情况下不存在。我敢肯定,这里有一些基本而简单的东西我只是没有掌握。任何帮助表示赞赏!

4

3 回答 3

3

是的,您肯定缺少一些基本概念。在 C# 中,变量不是全局的。它们有范围,请参阅:http: //msdn.microsoft.com/en-us/library/aa691132 (v=vs.71).aspx 。在您的情况下,范围GameUI frmGameUI = new GameUI();是您在其中声明它的方法的本地范围。因此,该方法之外的任何人都无法看到该变量。也就是说,他们看不到那个名字的变量。这并不是说您不能将该变量传递给另一个方法。因此,如果您需要LocationHandler该类来处理该变量,那么也许您应该将它传递给 InitializeRoom 方法。像这样:

LocHandler.InitializeRoom(frmGameUI);

请注意,您的方法签名将更改为:

public void InitializeRoom(GameUI gameui)

然后您在该方法中的代码将引用该gameui变量。

///<snip> 
        gameui.btnLocation1.Text = "Bedroom";
        gameui.btnLocation2.Text = "Kitchen";
        gameui.btnLocation3.Text = "Patio";

说得通?

于 2013-06-29T18:50:17.463 回答
0

使用已初始化的实例创建不同的类并将它们作为公共的保留在那里

于 2013-06-29T18:55:13.827 回答
0

该方法的执行Main将在此行停止,同时显示主窗体。

Application.Run(new MainUI());

因此,您可能想要做的是将要创建的代码移到LocationHandler这一行上方,并将其传递给GameUI. (也替换MainUIGameUI

于 2013-06-29T18:42:19.337 回答