我已经阅读了C#中的Stack实现代码。
该代码正在运行,但是我不知道在同一个类中包含一个类的对象是否非法(我确定它是合法的,因为我可以编译)。代码如下。
"Autofac/4.2.1": {
"dependencies": {
"System.ComponentModel": "4.0.1"
},
"runtime": {
"lib/netstandard1.1/Autofac.dll": {
"assemblyVersion": "4.2.1.0",
"fileVersion": "4.2.1.0"
}
}
}
代码已编译并可以正常运行。
我很困惑,在Entry类内部,它具有Entry类的字段public class Stack{
Entry top;
public void Push(object data){
top = new Entry(top, data);
}
public object Pop(){
if(top==null) throw new InvalidOperationException();
object result = top.data;
top = top.next;
return result;
}
class Entry{
public Entry next;//?
public object data;
public Entry(Entry next, object data){
this.next = next;
this.data = data;
}
}
}
。
此外,当Stack调用Push方法时,它会调用Entry构造函数,该函数将next
设置为this.next
,但是我不知道它是如何工作的,next
会指向对象this.next
,但要在何处以及如何创建对象“下一个”。
如果有人可以帮助我理解以上代码,我将非常感激。
答案 0 :(得分:3)
字段next
存储对另一个对象Entry
的引用,或空引用。请注意,next
可以为空!
您的困惑可能来自误解,即创建一个Entry
时,您必须首先需要一个Entry
的实例,乍一看似乎很循环。但是,请注意,您可以将null
作为第一个参数:
Entry entry1 = new Entry(null, someObject);
本质上,Entry
代表链表中的一个节点,该链表又用于实现堆栈:
A ---> B ---> C
next
中的A
是B
。 next
中的B
是C
。 next
中的C
是什么?是null
!
答案 1 :(得分:0)
那样的工作流程
top = new Entry(top, data);
(A),top.next
<---空top = new Entry(top, data);
(B),top.next
<---(A)top = new Entry(top, data);
(C),top.next
<---(B) Pop(),因为现在InvalidOperationException
抛出了top == null
。
第一个问题(对象“ next”在何处以及如何创建)
第一次推送是SPECIALY,接下来是null,但是还可以,因为当pop()时,它具有null检查。