C# 属性来处理空类

问题描述 投票:0回答:2

我有一个节点类。这种类型的变量可能为空,节点类包含指向另一个节点的指针变量。如果节点类为 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;
            }
        }

我尝试为 Next 属性的 getter 添加一个空检查,但它似乎不起作用。error message

c# oop properties null getter-setter
2个回答
0
投票

简短的回答是 - 不,如果对象是

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
    (而不是上面建议的扩展)就足够了。

0
投票

您不能在 C# 中访问空对象的属性。因为当您尝试访问

myNode
myNode.Next
为 null,所以它无法在运行时访问,仅仅是因为它不存在。

我喜欢用门和门后面的东西做类比。如果创建了一个对象,但它的所有属性都为空,这就像走进一个完全空荡荡的房间。如果该对象为 null,就好像门被关上了。你不能进入房间,所以当我问你那个房间里有没有沙发时,你不知道,因为你无法看到里面。查看对象内部的唯一方法是首先实例化它。

© www.soinside.com 2019 - 2024. All rights reserved.