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 中,我有这两个位来初始化对象:

 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’。”

如果我将实例化“Greyhound Dog1 = 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 回答