【问题标题】:Identifying null objects in C#在 C# 中识别空对象
【发布时间】:2012-04-29 09:28:31
【问题描述】:

我正在进行一个方法调用,它将另外四个方法调用的结果作为参数——但是进行这些调用的方法可能为空,也可能不为空(抱歉,如果这是一个令人绝望的难以理解的句子)。这是代码,如果它使事情更清楚:

    public void Inform(Room north, Room south, Room east, Room west)
    {
        this.north = north;
        this.south = south;
        this.east = east;
        this.west = west;

        node.Inform(north.GetNode(), south.GetNode(),
                    east.GetNode(), west.GetNode());
    }

基本上,我想知道是否有一种快速简便的方法来检查对象是否为空,并且只需将“空”传递给除条件之外的方法——我宁愿不必为所有 16 种可能的变体显式编码为空/不为空。

编辑:为了应对混乱,我想澄清这一点:大多数情况下,我传递给方法的对象不会为空。通常,Room 对象存在于北、南、东和西,如果存在Room,GetNode() 方法将返回适当的对象。我想确定给定的Room 是否存在以避免在尝试进行方法调用时出现空引用异常。

【问题讨论】:

  • 您的问题令人困惑。如果一个对象是null,而你想传递null...为什么不直接传递这个对象呢? null 值将通过。也许您可以发布您设想的 16 种变体代码的简短示例,以便我们确切地看到您想要的结果?
  • 我知道这是另一个 SO 问题的欺骗,但我找不到它。但我认为你想要的是这样的:node.Inform(north == null ? null : north.GetNode(), ...);
  • 好的,所以这不是一个完全的骗局,但与此类似:stackoverflow.com/questions/550374/…
  • Domenic,大多数时候对象不会为空——我希望有一些返回的对象被传递到方法中。但是,由于调用返回我想要的对象的对象(即北调用 GetNode())可能为空,抛出异常,我希望能够确定 Room 对象是否为空。

标签: c# xna


【解决方案1】:

创建一个extension method

static Node GetNodeOrNull(this Room room)
{
  return room == null ? null : room.GetNode();
}

【讨论】:

    【解决方案2】:
     public void Inform(Room north, Room south, Room east, Room west)
        {
            this.north = north;
            this.south = south;
            this.east = east;
            this.west = west;
    
            node.Inform(GetNode(north), GetNode(south),
                        GetNode(east),GetNode(west));
        } 
    
        private Node GetNode(Room room)
        {
            return room == null ?  null : room.GetNode();
        }
    

    【讨论】:

      【解决方案3】:

      忽略您的其余代码(我必须这样做:))-您可以开始使用 Null 模式。例如,有一个 NullRoom 类并让它的 GetNode() 返回一些有意义的东西。基本上不允许实际的空引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 2010-11-13
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多