我有一个节点类。这种类型的变量可能为空,节点类包含指向另一个节点的指针变量。如果节点类为 null,如何在尝试访问指向下一个节点的指针时将 getter 更改为返回 null? 我的代码:
public class Node
{
private T _data;
private Node _next;
public T Data
{
get => _data;
set
{
if (this != null)
{
_data = value;
}
}
}
public Node Next
{
get
{
if (this != null)
{
return _next;
}
return null;
}
set
{
if (this != null)
{
_next = value;
}
}
}
public Node(T data)
{
Data = data;
Next = null;
}
}
简短的回答是 - 不,如果对象是
null
你根本不能调用它的任何属性/方法因此没有代码in方法/属性将能够处理这种情况。
如果你真的想要类似的语法,你可以切换到静态的扩展方法,因此可以在调用之前实际检查值是否为
null
。请注意,对于代码的读者来说,在null
上调用方法实际上会成功,这可能会让他们感到非常困惑/惊讶。
public static Node GetNext(this Node n) => n?.Next;
您还可以考虑空对象编码模式是否适合您的情况。
注意事项
this != null
通常对常规代码进行毫无意义的检查,因为在正常情况下这不可能是 null
(请参阅Within a C# instance method, can'this' ever be null?)?
像node?.Next
(而不是上面建议的扩展)就足够了。您不能在 C# 中访问空对象的属性。因为当您尝试访问
myNode
时 myNode.Next
为 null,所以它无法在运行时访问,仅仅是因为它不存在。
我喜欢用门和门后面的东西做类比。如果创建了一个对象,但它的所有属性都为空,这就像走进一个完全空荡荡的房间。如果该对象为 null,就好像门被关上了。你不能进入房间,所以当我问你那个房间里有没有沙发时,你不知道,因为你无法看到里面。查看对象内部的唯一方法是首先实例化它。