为什么动态分配数组的大小必须是静态字段?

时间:2010-04-03 12:23:52

标签: c# .net

我有一个虚拟类,我正在测试数组。我注意到,当我想在运行时动态分配数组大小时,指示此大小的字段必须是静态的。我知道我应该使用这种代码的集合,但我更感兴趣为什么这些字段必须是静态的?这背后有什么特别的原因吗?

class Foo
{
    private static int x;
    private static int y;

    private int[,] bar = new int[ x, y ];

    public Foo( int a, int b )
    {
        x = a;
        y = b;
    }
}

2 个答案:

答案 0 :(得分:5)

它们实际上不必是静态的 - 只是你不能在实例变量初始化器中引用其他实例变量。换句话说,它有点像这样:

class Foo
{
    private int x;
    private int y = x; // Invalid
}

来自C#3规范的第10.5.5.2节:

  

实例的变量初始值设定项   字段无法引用实例   被创造。因此,它是一个   编译时错误引用此   在变量初始化程序中,因为它是一个   变量的编译时错误   初始化程序引用任何实例   会员通过一个简单的名字。

我怀疑你真的想要这样的东西:

class Foo
{
    private int x;
    private int y;

    private int[,] bar;

    public Foo( int a, int b )
    {
        x = a;
        y = b;
        bar = new int[x, y];
    }
}

当然,您根本不需要xy - 它们只是方便地保留数组的每个维度。你可以也使用bar.GetLength(0)bar.GetLength(1)来获得两个长度,但这并不是非常令人愉快。

您可能希望将xy重命名为widthheight,或类似的东西:)

答案 1 :(得分:1)

'Foo将永远不会有数组'的示例只是一个大小为[0,0]的数组:它的实例化在您调用类构造函数之前发生。

试试这个:

public class Foo2
{
    private int[,] bar;

    public Foo2(int a, int b)
    {
        bar = new int[a,b];
    }
}

这将为您提供一个大小为[a,b]的数组,而不使用'static。