C#构造函数帮助

时间:2009-08-01 15:43:32

标签: c#

在下面的代码块中,为什么我需要在类中声明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";
        }
    }
}

8 个答案:

答案 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);