Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中创建和运行同一类的多个对象?_C#_Class - Fatal编程技术网

如何在c#中创建和运行同一类的多个对象?

如何在c#中创建和运行同一类的多个对象?,c#,class,C#,Class,在我的程序中,我正在创建在屏幕上移动的图片框。我想让它,让用户可以创建尽可能多的这些他们想要的。为此,我创建了一个类,该类在创建picturebox后分配给它,并控制它的移动。这适用于picturebox,直到我创建另一个picturebox时,它不再受控制。我认为这是因为c#不允许我创建一个类的多个对象,因此会结束以前的对象来创建一个新对象。我是这样做的: static ArrayList cps = new ArrayList(); public void ShootCannon() {

在我的程序中,我正在创建在屏幕上移动的图片框。我想让它,让用户可以创建尽可能多的这些他们想要的。为此,我创建了一个类,该类在创建picturebox后分配给它,并控制它的移动。这适用于picturebox,直到我创建另一个picturebox时,它不再受控制。我认为这是因为c#不允许我创建一个类的多个对象,因此会结束以前的对象来创建一个新对象。我是这样做的:

static ArrayList cps = new ArrayList();

public void ShootCannon() {
    Image cubeImage= Image.FromFile("C:\\Users\\Stefan\\Documents\\Visual Studio 2010\\Projects\\Game1\\Game1\\Resources\\CannonCube.png");
    PictureBox cannonCube = new PictureBox();
    ScreenPanel.Controls.Add(cannonCube);
    cannonCube.Image = cubeImage;
    cannonCube.SetBounds(cannonCubeInst.X, cannonCubeInst.Y, cubeImage.Width, cubeImage.Height);
    cannonCube.BringToFront();

    cps.Add(new CubeProjectile(cannonCube));
}
立方体投影的类别是:

public class CubeProjectile
{

    static PictureBox box;

    public CubeProjectile(PictureBox box1)
    {
        box = box1;
        Timer Update = new Timer();
        Update.Interval = 1;
        Update.Tick += new EventHandler(Timer_Tick);
        Update.Start();
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        Point loc = new Point(box.Location.X, box.Location.Y);
        box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height);
    }

}

类中声明的静态变量对于该类的所有实例都是公共的。因此,您的PictureBox框将被传递给类的构造函数的最新PictureBox覆盖

因此,如果您使用上面的代码并调用

 CubeProjectile cb1 = new CubeProjectile(pic1);
 CubeProjectile cb2 = new CubeProjectile(pic2);
cubeproject的两个实例都共享传递给构造函数的最新picturebox
pic2

相反,如果在没有静态修饰符的情况下声明变量,则该类的每个实例都有自己的PictureBox

public class CubeProjectile
{

    private PictureBox box;

    public CubeProjectile(PictureBox box1)
    {
        box = box1;
        Timer Update = new Timer();
        Update.Interval = 1;
        Update.Tick += new EventHandler(Timer_Tick);
        Update.Start();
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        Point loc = new Point(box.Location.X, box.Location.Y);
        box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height);
    }

}

 CubeProjectile cb1 = new CubeProjectile(pic1);
 CubeProjectile cb2 = new CubeProjectile(pic2);
现在,
cb1
在内部变量
框中存储了对
pic1
的引用,而cb2引用了
pic2


但是,请记住,PictureBox是一个可能昂贵资源(Image属性)的宿主,您应该确保在不再需要时处置这些CubeProject实例

您可以创建所需的类实例数量

问题是您在类中使用的是静态变量。这只存在一次,无论创建多少实例。创建第二个实例时,它将用新图片框覆盖静态变量中的值

您需要一个实例变量来为类的每个实例保存一个图片bx

更改此项:

static PictureBox box;
致:


旁注:一个好的做法是为类成员指定访问级别,并且只公开那些您希望从类外部访问的成员。将成员变量设置为私有可确保仅从该实例访问该变量:

private PictureBox box;
“c#不允许我创建一个类的多个对象”你在说什么?PictureBox不是单例。修复您的私人静态图片盒。
private PictureBox box;