0

私は C# の初心者ですが、インスタンス化と参照の受け渡しについて、私が理解していない基本的なことがあると思います。

デフォルトの Program クラスを取得して、他の 2 つのクラス、frmGameUI というフォームと LocHandler というクラスをインスタンス化しようとしています。これが正しく機能している場合、LocHandler は現在の場所を確認し、frmGameUI のテキスト プロパティを割り当てます。何らかの理由で、LocHandler でプロパティを設定するメソッドは、プログラムでインスタンス化した 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 に答える