2009-08-01 97 views
1

在下面的代码块中,为什么我需要在类中声明myData,然后在构造函数中初始化myData = new string [size]?为什么编写私有字符串[] myData = new string [size]是非法的?C#构造函数帮助

也就是说,为什么我需要做的:

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"; 
     } 
    } 
} 
+1

你能澄清这个问题吗?你在问为什么成员变量必须在函数范围之外声明,或者你发现你的构造函数没有按预期工作? – 2009-08-01 15:47:52

回答

9

因为变量 “大小” 仅在构造函数中存在。

+2

这基本上回答了这个问题,但ShuggyCoUk的答案更好,因为它解释了为什么'大小'不会总是被知道。 – weiqure 2009-08-01 16:45:57

2

因为size是构造函数的参数,只存在于构造函数的作用域内。

5

因为size只有构造函数在运行时 - 不是编译时。如果你想大小myData到一定的大小 - 即在编译时已经知道,那么你可以做到这一点的声明:

private string[] myData = new string[1000]; 

private const int DATA_SIZE = 1000; 

private string[] myData = new string[DATA_SIZE]; 
1

因为你不知道大小直到构造函数被调用。下面的字段定义是好的:

private string[] myData = new string[100]; 
6

因为你不知道会是什么大小,或者即使它存在于构造函数之外。

内联初始化程序作为的所有构造函数的一部分运行。如果添加了另一个没有大小的构造函数,会导致课程中断,这是一个令人困惑的事情。

此外,即使编译器做得足够聪明以检查所有这些,这将是一个混淆范围滥用。如果在课堂上的其他地方有一个叫做“大小”的恒定字段呢?

所有这些都是为什么不试图允许这种事情的原因,它有宝贵的小好处,所以为什么打扰。

1

出于以下原因,您无法这么做:编译器如何知道编译时的大小?

如果要初始化一个具有运行时变量大小的数组,则必须在变量具有值时将其初始化为运行时方法!

+1

恩。即使您指定常量,所有数组也会在运行时初始化。使用一个变量(作用域为对象,而不是构造函数)是完全合法的,尽管它没有预期的效果,除非变量在数组初始化之前被初始化。 – tvanfosson 2009-08-01 16:03:53

2

这里的问题是范围之一。您不能在构造函数之外引用size(构造函数的参数),因为它没有在构造函数之外定义。这会给你一个编译错误。如果变量是在对象中定义的,那么这将是完全合法的,但是您将依赖于初始化的顺序,以确定您是否会获得预期的效果。如果变量的初始化器在数组的初始化器之前运行,那么它可能工作。国际海事组织,你最好在构造函数中进行初始化,因为这样你可以定义执行顺序并知道什么时候会发生。

0

因为如果试图以这种方式

类IntIndexer

{

私人的String [] myData的=新的字符串[大小]做的;

public IntIndexer(int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     myData[i] = "empty"; 
    } 
} 

}

你会得到编译错误 名称“大小”不存在当前上下文存在。

因此在这一点上 私人字符串[] 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"; 
    } 
} 

}

即你将其尺寸被设置这样

IntIndexer实例=新IntIndexer(100);