代码之家  ›  专栏  ›  技术社区  ›  Ondrej Slinták

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

  •  1
  • Ondrej Slinták  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  5
  •   Jon Skeet    14 年前

    它们实际上不必是静态的——只是不能引用实例变量初始值设定项中的其他实例变量。换句话说,有点像这样:

    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];
        }
    }
    

    你当然不需要 x y 总之,它们只是方便保留数组的每个维度。你 能够 同时使用 bar.GetLength(0) bar.GetLength(1) 两种长度,但那不是很愉快。

    您可能需要重命名 X Y width height 不过,或者类似的东西:)

        2
  •  1
  •   BillW    14 年前

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

    试试这个:

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

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