我是C#的初学者,我认为有一些关于实例化和传递引用的基本信息,我只是不知道。
我正在尝试使用默认的Program类来实例化其他2个类,一个名为frmGameUI的表单和一个名为LocHandler的类。如果这正常工作,LocHandler将检查当前位置并分配frmGameUI的文本属性。由于某种原因,在LocHandler中设置属性的方法无法查看或获取我在Program中实例化的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。我确信有一些基本而简单的东西,我不会在这里掌握。任何帮助表示赞赏!
答案 0 :(得分: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";
有意义吗?
答案 1 :(得分:0)
当显示主窗体时,Main
方法的执行将在此行停止。
Application.Run(new MainUI());
所以您可能想要做的是将代码移到此行上方创建LocationHandler
,然后将其传递给GameUI
。 (并将MainUI
替换为GameUI
)
答案 2 :(得分:0)
使用初始化实例创建不同的类,并将它们保存为public's