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

时间:2009-07-29 22:23:15

标签: c#

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

*Customer cust = new Customer();*

使用System;

/// <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";
        }
    }

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

要解决这个问题:

Customer cust = new Customer();

这可以分为两部分:

Customer cust;
cust = new Customer();

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

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

private string[] myData;

myData = new string[size];

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

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

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

答案 2 :(得分:0)

您是否正在尝试在其内部调用构造函数?就像你想要实例化IntIndexer一样,你必须调用这个函数并重复这个过程,直到你意识到这会导致堆栈溢出或者永远不会终止,因为它总是试图创建第n个实例,因为n只是继续前进和前进起来。

如果我只是按照这种方式追踪,我在你的例子中缺少什么?

答案 3 :(得分:0)

他们是两件不同的事。 myData已声明为string[]类型,而不是类型IntIndexer

班级IntIndexer包含一个名为myData的变量。它们并不等同。

您也不会将该类型放在该行代码前面,因为您将重新声明该变量。这样做会给你一个编译器错误。

答案 4 :(得分:0)

myData已经被声明为IntIndexer类的一个字段,因此您不必在构造函数中重新声明它。该课程理解它正在引用自己的领域。