我有一个虚拟类,我正在测试数组。我注意到,当我想在运行时动态分配数组大小时,指示此大小的字段必须是静态的。我知道我应该使用这种代码的集合,但我更感兴趣为什么这些字段必须是静态的?这背后有什么特别的原因吗?
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;
}
}
答案 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];
}
}
当然,您根本不需要x
和y
- 它们只是方便地保留数组的每个维度。你可以也使用bar.GetLength(0)
和bar.GetLength(1)
来获得两个长度,但这并不是非常令人愉快。
您可能希望将x
和y
重命名为width
和height
,或类似的东西:)
答案 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。