我有一个虚拟类,我正在测试数组.我注意到,当我想在运行时动态分配数组大小时,指示此大小的字段必须是静态的.我知道我应该使用这种代码的集合,但我更感兴趣为什么这些字段必须是静态的?这背后有什么特别的原因吗?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
它们实际上不必是静态的 - 只是你不能在实例变量初始化器中引用其他实例变量.换句话说,它有点像这样:
class Foo
{
private int x;
private int y = x; // Invalid
}
Run Code Online (Sandbox Code Playgroud)
从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];
}
}
Run Code Online (Sandbox Code Playgroud)
当然,你并不真正需要x,并y在所有-他们只是方便,以保持阵列的每个维度.你也可以使用bar.GetLength(0)和bar.GetLength(1)获得两个长度,但这并不是非常令人愉快.
你可能要重新命名x,并y以width和height,虽然,或类似的东西:)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |