在下面的代码块中,为什么我需要在类中声明myData,然后在构造函数中初始化myData = new string [size]?为什么编码私有字符串[] myData = new string [size]?
是非法的也就是说,我为什么要这样做:
class IntIndexer
{
private string[] myData;
public IntIndexer(int size)
{
myData = new string[size];
for (int i = 0; i < size; i++)
{
myData[i] = "empty";
}
}
}
而不是
class IntIndexer
{
private string[] myData = new string[size];
public IntIndexer(int size)
{
for (int i = 0; i < size; i++)
{
myData[i] = "empty";
}
}
}
答案 0 :(得分:9)
因为变量“size”仅存在于构造函数中。
答案 1 :(得分:6)
因为你不知道它的大小,或者它是否存在于构造函数之外。
内联初始化程序作为类中所有构造函数的一部分运行。添加另一个没有大小的构造函数会破坏你的类,如果这是实现的,这是一个混乱的事态。
即使编译器足够聪明以检查所有这些,也可能是混乱的范围滥用。如果在类中的其他地方有一个称为大小的常量字段会怎么样?
所有这些都是不试图允许这类事情的原因,并且它没有什么好处,所以为什么要这么麻烦。
答案 2 :(得分:5)
因为只有运行时的构造函数知道size
- 而不是编译时。如果你想将myData
的大小调整为常量 - 即在编译时已知,那么你可以在声明中这样做:
private string[] myData = new string[1000];
或
private const int DATA_SIZE = 1000;
private string[] myData = new string[DATA_SIZE];
答案 3 :(得分:2)
因为size是构造函数的参数,并且只存在于构造函数的范围内。
答案 4 :(得分:2)
这里的问题是范围之一。您不能在构造函数之外引用构造函数的size
参数,因为它不是在构造函数外部定义的。这会给你一个编译错误。如果变量是在对象中定义的,那么它将是完全合法的,但是您将依赖于初始化的顺序,以确定是否会获得您想要的效果。如果变量的初始化程序在数组的初始化程序之前运行,那么它可能会起作用。 IMO,你最好在构造函数中进行初始化,因为这样你就可以定义执行的顺序,知道什么时候会发生。
答案 5 :(得分:1)
因为在调用构造函数之前您不知道大小。以下字段定义很好:
private string[] myData = new string[100];
答案 6 :(得分:1)
你不能这样做有一个原因:编译器如何知道编译时的大小有多大?
如果要初始化具有运行时变量大小的数组,则必须在变量具有值时在运行时方法中初始化它!
答案 7 :(得分:0)
因为如果你试图这样做
类IntIndexer
{
private string [] myData = new string [size];
public IntIndexer(int size)
{
for (int i = 0; i < size; i++)
{
myData[i] = "empty";
}
}
}
您将收到编译错误 当前上下文中不存在名称“size”。
此时此刻 private string [] myData = new string [size]; 尺寸尚未宣布。
如果您将以这种方式写作,您将获得大小的价值作为您的目标,我认为将使其变得灵活,并让实例为您做到这一点,这就是为什么您的目标可以通过这个来完成
类IntIndexer { private string [] myData;
public IntIndexer(int size)
{
myData = new string[size];
for (int i = 0; i < size; i++)
{
myData[i] = "empty";
}
}
}
即你将设置这样的大小
IntIndexer instance = new IntIndexer(100);