相同对象的数组

本文关键字:数组 对象 | 更新日期: 2023-09-27 18:13:19

如果我想声明相同对象的数组(我的意思是相同的构造函数参数值)。我可以一次完成吗?

在下面的例子中,如果我想创建4个具有相同尺寸(3,3,2)的box对象,我调用了4次构造函数。我能一次完成吗?

class Program
{
    static void Main(string[] args)
    {
        Box b = new Box(3, 4, 7);
        Console.WriteLine(b.getVolume());
        Box[] matchBoxes = new Box[4];
        matchBoxes[0] = new Box(3, 3, 2);
        matchBoxes[1] = new Box(3, 3, 2);
        matchBoxes[2] = new Box(3, 3, 2);
        matchBoxes[3] = new Box(3, 3, 2);

        Console.ReadLine();
    }

}
class Box
{
    private int length;
    private int breadth;
    private int height;
    public Box(int l, int b, int h)
    {
        this.length = l;
        this.breadth = b;
        this.height = h;
    }
    public int getVolume()
    {
        return (this.length*this.breadth*this.height);
    }
}

相同对象的数组

看情况。因为这是一个class,你需要调用new 4次,如果你想得到4个不同的对象。然而,你的盒子看起来是不可变的;如果您乐意将同一个对象使用4次(在这里可能是合理的),您可以使用:

var box = new Box(3,3,2);
var matchBoxes = new[] {box,box,box,box};

如果这是您的Box类型的全部,那么可能还需要考虑使其成为struct(不可变的、小的、值式确定的struct候选)。那么它是没有意义的:它在每个位置是不同的。不过,结构可以与上面相同。

如果你想创建4个新对象,你必须调用4次构造函数。如果不想键入,请使用cycle:

for(int i = 0; i < 4; i++) matchBoxes[i] = new Box(3, 3, 2); 

很多答案都是正确的(使用结构体,使用循环);

只是为了完成:

    Box[] matchBoxes = Enumerable.Repeat(new Box(3, 3, 2), 4).ToArray();

注意正如Marc Gravell所说,这将不会给出Box的单独副本,除非它是一个valuetype。

你甚至可以让它更一般:

    var generator   = Enumerable.Repeat(new Box(3, 3, 2));
    // ....
    var fourBoxes   = generator.Take(4);
    var twentyBoxes = generator.Take(20);
var matchBoxes = Enumerable.Repeat(new Box(3, 3, 2), 4).ToArray();

没有。每个对象都需要单独创建。使用循环:)

为什么不使用循环,在构造函数中传递参数?

我希望这能解决你的问题,

Box[] matchBoxes = new Box[]{ new Box(3, 3, 2), new Box(3, 3, 2), new Box(3, 3, 2), new Box(3, 3, 2)};