相同对象的数组

时间:2011-11-01 08:12:20

标签: c# arrays

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

在下面的例子中如果我想创建4个具有相同尺寸(3,3,2)的盒子对象,我调用了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);
    }

}

7 个答案:

答案 0 :(得分:3)

这取决于。由于这是class,您需要拨打new 4次如果您想获得4个不同的对象。但是,你的盒子看起来是不可变的;如果您乐意使用相同的对象4次(这可能是合理的),您可以使用:

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

如果这是Box类型的全部内容,那么可能也要考虑将其设为struct(不可变的,小的,值 - esque - 明确{{ 1}}候选人)。然后它没有实际意义:在每个位置都是不同的。但是,构造可以与上面相同。

答案 1 :(得分:1)

如果要创建4个新对象,则必须调用构造函数4次。如果您不想输入它,请使用cycle:

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

答案 2 :(得分:1)

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

要完成:

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

注意正如Marc Gravell所说,这将 NOT 提供Box的单独副本,除非它是一个值类型。

你甚至可以使它更通用:

    var generator   = Enumerable.Repeat(new Box(3, 3, 2));

    // ....
    var fourBoxes   = generator.Take(4);
    var twentyBoxes = generator.Take(20);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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