定义一个具有相同类字段的类。带有自我引用的类?

mr *_*fat 1 c# class self-reference

您可以定义一个具有属于该类的成员字段的类,这似乎很奇怪。

public class Person
{
    public string Name { get; set; }
    public Person Spouse { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我调用该类:

var jane = new Person();
var jim = new Person();
jane.Spouse = jim;
jim.Spouse.Spouse = jane;
Run Code Online (Sandbox Code Playgroud)

最后一行会导致错误。但我在想象 jim.Spouse.Spouse 调用正在做什么时遇到了一些麻烦。它应该首先评估 jim.spouse ,它为空,所以它会导致错误,对吗?如果我首先断言 jim.Spouse = jane 那么它应该起作用吗?但我本质上是说 jane.spouse = jane.

如果一个类有一个相同类型的字段,那么它对该类做了什么?它只是允许类的两个实例建立关系吗?该类引用自身,因此它继承自自身?我有点困惑,也想知道这是否是不好的做法。

Eva*_*oli 5

您在这里问了几件事,但一般来说,在对象上引用相同类型(甚至相同实例)是可以的。

public class Thing {
    private string name;

    public Thing(string name) {
        this.name = name;
    }
    public Thing Other {
        get;
        set;
    }

    public override string ToString() {
        return this.name;
    }
}

var o = new Thing("Foo");
o.Other = o;
Debug.WriteLine(o.Other.Other.Other.Other.ToString()); // Could go on forever
Run Code Online (Sandbox Code Playgroud)
  1. 您关于异常的断言是正确的。它会抛出异常,因为它jim.Spouse是一个空引用,因此您无法在其上设置属性。
  2. 如果您设置了jim.Spouse = jane;,那么您应该能够设置参考。在这种情况下,您可能会想说jim.Spouse.Spouse = jim;,sincejim.Spouse的计算结果为jane
  3. 对于相同类型的字段来说,和其他的没有什么不同。它只是一个具有类使用的类型的变量。一个类型引用同一类型的其他内容并不是一种罕见的模式。例如,Employee 类可能引用 Manager,而 Manager 也是 Employee。另一个常见的例子是树的实现,在二叉树中,节点将具有对左/右子节点的引用。