可能的NullReferenceException

时间:2010-12-17 16:16:46

标签: c# nullreferenceexception

例如这段代码:

private void LoadComments(Member member, XElement commentsXml)
{
    member.Comments = (from comment in commentsXml.Descendants("comment")
                     select new Comment()
                     {
                         ID = comment.Element("id").Value,
                         Text = comment.Element("text").Value,
                         Date = comment.Element("date").Value,
                         Owner = comment.Element("user").Element("name").Value
                     }).ToList();
}

ReSharper警告我,comment.Element行可能存在NullReferenceException。确实如此,异常被解雇了。

有关如何避免这种情况的任何建议吗?如果它返回null,只返回一个空字符串,这可能吗?

4 个答案:

答案 0 :(得分:2)

我更喜欢它的扩展类:

public static class XElementExtension
{
   public static string GetValue(this XElement input)
   {
      if (input == null)
        return null;
      return input.Value as T;
   }

   public static XElement GetSubElement(this XElement element, string id)
   {
      if (element == null)
        return null;
      return element.Element(id);
   }
}

并将其用作:

ID = comment.Element("id").GetValue()

Owner = comment.Element("user").GetSubElement("name").GetValue()

还有其他方式:

http://www.codeproject.com/KB/cs/maybemonads.aspx

答案 1 :(得分:1)

我只能认为你需要检查每个元素引用:

private void LoadComments(Member member, XElement commentsXml)
{
    member.Comments = (from comment in commentsXml.Descendants("comment")
                     select new Comment()
                     {
                         ID = (comment.Element("id")==null)?"":comment.Element("id").Value,
                         Text = (comment.Element("text")==null)?"":comment.Element("text").Value,
                         Date = (comment.Element("date")==null)?"":comment.Element("date").Value,
                         Owner = (comment.Element("user")==null)?"":comment.Element("user").Element("name").Value
                     }).ToList();
}

最后一点有点弱,因为有两个节点确实应该被检查但是嵌套看起来有点不愉快,但唯一的方法是确定。

编辑----

作为扩展方法:

public static class MyExtensions
{

    public static string ValueSafe(this XElement target)
    {
        if (target==null)
            { return ""; }
        else
            { return target.Value; }
    }

}

然后,您可以将.Value替换为.ValueSafe,表示没有机会进行测试。

答案 2 :(得分:1)

一些扩展可能有所帮助:

实施例

public static class XElementExtensions
{
    public static XElement GetElement(this XElement element, XName elementName)
    {
        if (element != null)
        {
            XElement child = element.Element(elementName);

            if (child != null)
            {
                return child;
            }
        }

        return null;
    }

    public static String GetElementValue(this XElement element, XName elementName)
    {
        if (element != null)
        {
            XElement child = element.Element(elementName);

            if (child != null)
            {
                return child.Value;
            }
        }

        return null;
    }
}

用法:

private void LoadComments(Member member, XElement commentsXml)
{
    member.Comments = (from comment in commentsXml.Descendants("comment")
                        select new Comment()
                        {
                            ID = comment.GetElementValue("id"),
                            Text = comment.GetElementValue("text"),
                            Date = comment.GetElementValue("date"),
                            Owner = comment.GetElement("user").GetElementValue("name")
                        }).ToList();
}

答案 3 :(得分:0)

有可能 - 您需要将每个comment.Element().Value语句包装在函数中。

我喜欢使用:

public string UnNull(object v)
{
   if (v == null) return "";
   return v.ToString();
}

至于最后一行,你需要额外关注那里以确保comment.Element("user")不是null并处理该情况。