0

私はC#の学習に関する本をフォローしようとしていますが、つまずきに遭遇しました。画面上を4匹の犬が走る、レーストラックの模倣機であるアプリを作成することになっています。犬をトラック上で動かすメカニズムを除いて、ほとんどが機能しています。したがって、最初に、Greyhoundクラスを別のクラスファイルで宣言します。

public class Greyhound
{
    public int StartingPosition;
    public int RaceTrackLength;
    public PictureBox MyPictureBox = null;
    public int Location = 0;
    public int Lane = 0;
    public Random Randomizer;


    public void Run() //Makes the dog move down the track.
    {
        Location += Randomizer.Next(0, 4);
        MyPictureBox.Location = new Point(Location, Lane);
    }
}

次に、form1.csに、オブジェクトを初期化するための次の2つのビットがあります。

 public void LoadDogs()
    {
        Greyhound Dog1 = new Greyhound()
        {
            StartingPosition = 30,
            MyPictureBox = pictureBox2, //Pointer at the picture box for this dog.
            Location = 30,  //X cordinates of the picture box
            Lane = 21 //Y cordinates of the picutre box
        };
    }


     public Form1()
    {
        InitializeComponent();
        LoadDogs();
    }

私が遭遇している問題は、オブジェクトの初期化を中断せずにDog1.Run()を実際に機能させることができないことです。

Dog1.Run()をtimer1_Tickイベント内に配置しようとすると、「「Dog1」という名前は現在のコンテキストに存在しません」というメッセージが表示されます。

インスタンス化「GreyhoundDog1=new Greyhound()......」をメソッドの一部ではなくメインエリア内に配置すると、これを修正できます。しかし、参照しようとしているピクチャーボックスに関するエラーメッセージが表示されます。「フィールド初期化子は、非静的フィールド、メソッド、またはプロパティ'DayAtTheTrack.Form1.pictureBox2'を参照できません。」

C#でスコープがどのように処理されるかは、まだ少し混乱しています。

4

2 に答える 2

1

あなたが提案している「修正」は実際には明確ではありませんが、あなたが書いたコードの問題は、メソッド内Dog1ローカル変数であるということです。LoadDogsそのメソッドを終了するとすぐに、変数はなくなります。(オブジェクトを使用して何か他のことを行うと、オブジェクトは存続する可能性がありますが、変数は関連しなくなります。)

これに対する最も簡単な修正は、インスタンス変数にすることです。

private Greyhound dog1; // Declare the field here

public void LoadDogs()
{
    // Give the field a value here
    dog1 = new Greyhound
    {
        StartingPosition = 30,
        MyPictureBox = pictureBox2, //Pointer at the picture box for this dog.
        Location = 30,  //X cordinates of the picture box
        Lane = 21 //Y cordinates of the picture box
    };
}

戻って、さまざまな種類の変数(ローカル変数、インスタンス変数、静的変数)について説明している本の部分を調べる必要があります。残念ながら多くの本がそうであるように、それがそれらのことを説明するのにうまくいかない場合(残念ながら多くの本がそうであるように、コアコンセプトを説明するよりもきれいな写真を表示することに興味がある場合)、あなたはその本をあきらめてより良いものを見つけるべきです。

于 2012-11-01T17:38:12.143 に答える
0

これは、が関数Greyhound Dog1に対してローカルであるためですLoadDogs

フォームでDog1複数のメソッドからアクセスできるようにする場合は、Form1クラスのプロパティまたはフィールドである必要があります。

public partial Form1 
{
    private Greyhound dog1;

    public void Form_Load(object sender, EventArgs e)
    {
        dog1 = new Greyhound() {
            // bla bla bla, initialization
        };
    }
}

また、初期化には、使用することをお勧めしますForm_Load(まだ使用していない場合)。

于 2012-11-01T17:38:42.173 に答える