定义具有相同类的字段的类。有自引用的类?

时间:2016-06-05 00:59:42

标签: c# class self-reference

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

public class Person
{
    public string Name { get; set; }
    public Person Spouse { get; set; }
}

现在,如果我打电话给那个班:

var jane = new Person();
var jim = new Person();
jane.Spouse = jim;
jim.Spouse.Spouse = jane;

最后一行会导致错误。但是我在想象jim.Spouse.Spouse调用的内容时遇到了一些麻烦。它应该先评估jim.spouse是否为null,这样会导致错误吗?如果我首先断言jim.Spouse = jane那么它应该有效吗?但后来我基本上说jane.spouse = jane。

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

1 个答案:

答案 0 :(得分:4)

你在这里问过几件事,但一般情况下,在对象上引用相同类型(甚至是同一个实例)也没关系。

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
  1. 你对异常的断言是正确的。它会抛出,因为jim.Spouse是一个空引用,因此您无法在其上设置属性。
  2. 如果您设置jim.Spouse = jane;,那么您应该可以设置参考。在这种情况下,您可以说jim.Spouse.Spouse = jim;,因为jim.Spouse评估为jane
  3. 关于相同类型的字段,它与其他任何字段都没有区别。它只是一个具有类使用类型的变量。对于类型来说,引用相同类型的其他内容并不是一种不常见的模式。例如,Employee类可能具有对Manager的引用,Manager也是Employee。另一个常见示例是树实现,在二叉树中,Node将具有对Left / Right Child节点的引用。