这两条线之间有什么区别?(C#)

use*_*466 1 c#

在下面的斜体代码中,为什么我们不将"IntIndexer"放在myData = new string [size]之前; 因为Customer cust = new Customer(); (假设客户是班级的名称):

*Customer cust = new Customer();*
Run Code Online (Sandbox Code Playgroud)

使用系统;

/// <summary>
///     A simple indexer example.
/// </summary>
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)

Mar*_*ell 5

第一行(cust)声明并初始化字段或变量.

在第二个示例中,field(myData)是针对类型声明的,并且在构造函数(IntIndexer(...))中初始化.如果(在构造函数中)我们在它之前放置了一个类型,我们将声明一个具有相同名称的局部变量.这会令人困惑(你必须分别使用this.myDatamyData引用字段和变量).


Dan*_*ker 5

打破这个:

Customer cust = new Customer();
Run Code Online (Sandbox Code Playgroud)

这可以分为两部分:

Customer cust;
cust = new Customer();
Run Code Online (Sandbox Code Playgroud)

第一行表示该名称cust将能够引用类型的对象Customer.第二行创建一个新Customer对象并cust引用它.

你给出的另一个例子已经分为两部分:

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

和:

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

如果字符串数组的长度恒定,我们也可以将它折叠到一行上IntIndexer(在构造函数之前).

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

但是我们需要使用size传入IntIndexer构造函数,因此我们必须将声明和初始化分为两个步骤.