在下面的斜体代码中,为什么我们不将“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";
}
}
答案 0 :(得分:5)
第一行(cust
)声明并初始化字段或变量。
在第二个示例中,字段(myData
)是针对类型声明的,并在构造函数(IntIndexer(...)
)中初始化。如果(在构造函数中)我们在它之前放置了一个类型,我们将声明一个名为的局部变量。这会令人困惑(您必须使用this.myData
和myData
分别引用字段和变量。)
答案 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类的一个字段,因此您不必在构造函数中重新声明它。该课程理解它正在引用自己的领域。