C#构造函数帮助

use*_*466 1 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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代替

class IntIndexer
{
    private string[] myData = new string[size];

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

Rob*_*ser 9

因为变量"size"仅存在于构造函数中.

  • 这基本上回答了这个问题,但ShuggyCoUk的答案更好,因为它解释了为什么"大小"并不总是被人知道. (2认同)

Shu*_*oUk 6

因为你不知道它的大小,或者它是否存在于构造函数之外.

内联初始化程序作为类中所有构造函数的一部分运行.添加另一个没有大小的构造函数会破坏你的类,如果这是实现的,这是一个混乱的事态.

即使编译器足够聪明以检查所有这些,也可能是混乱的范围滥用.如果在班级的其他地方有一个称为大小的常量字段怎么办?

所有这些都是不试图允许这种事情的原因,并且它有一些宝贵的好处,所以为什么要这么麻烦.


Vin*_*jip 5

因为size只在运行时才知道构造函数- 而不是编译时.如果你想调整大小myData- 即在编译时知道,那么你可以在声明中做到:

private string[] myData = new string[1000];
Run Code Online (Sandbox Code Playgroud)

要么

private const int DATA_SIZE = 1000;

private string[] myData = new string[DATA_SIZE];
Run Code Online (Sandbox Code Playgroud)