构建字符串数组并检查C#中的空值?

时间:2011-02-03 10:27:39

标签: c# nullpointerexception

我正在创建一个包含自定义对象值的字符串数组,如下所示:

foreach(MyObject o in MyObjectList)
    string[] myArray = new string[] {o.id, o.number.toString(), o.whatever, ...}

这里的问题是,任何这些值都可以为NULL,这使得此代码崩溃。让我们说o.number是NULL而其余的不是......在这种情况下我仍然想要填充其他值并放入" NULL"作为字符串而不是o.number。

除了检查每个值之外,还有一个很好的方法吗?

谢谢:)

7 个答案:

答案 0 :(得分:3)

你需要检查每个值,但使用它不应该太糟糕?运算符,所以只需要为每个值做:

o.id ?? "NULL"

答案 1 :(得分:3)

对于相关的项目,我经常定义一个扩展方法ToStringOrNull,如下所示:

public static string ToStringOrNull(this object o) { 
    return o == null ? null : o.ToString();
}

为了避免智能感知污染,如果碰巧有一组有限的类型ToStringOrNull是有用的,你可以(我有时会)避免将扩展名添加到object而是复制粘贴相关类型的一堆副本。该函数很容易编写为单行,因此解决这种复制的代码是过度的。

然后,如果您希望用一些占位符文本替换字符串null,请使用null-coalescing运算符。

e.g。

string[] myArray = new [] {
    o.id, o.number.ToStringOrNull(), o.whatever, ...
};// .Select(s=>s??"NULL").ToArray(); //uncomment to replace null with "NULL"

答案 2 :(得分:2)

这是我的建议。

以这种方式实现扩展方法“AsString”:

namespace ConsoleApplication1
{
    public static class ObjectExtensions
    {
        public static string AsString(this object source)
        {
            if (source != null)
            {
                return source.ToString();
            }
            else
            {
                return null;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            object a = null;
            object b = "not null";

            string someText = a.AsString();
        }
    }
}

现在你可以在整个引用有对象时返回字符串,如果引用没有对象,则返回null。

答案 3 :(得分:1)

您只需检查可以为null的字段,例如

foreach(MyObject o in MyObjectList)
  string[] myArray = new string[] {
    o.id,
    (o.number == null ? "NULL" : o.number.toString(),
    o.whatever, ... };

答案 4 :(得分:1)

您必须检查每个值。一个简短的方法就是这样:

string nullStr = "NULL";
foreach (MyObject o in MyObjectList) {
    string[] myArray = new string[] {
        o.id,
        (o.number ?? nullStr).ToString(),
        (o.whatever ?? nullStr).ToString(),
        ...
    };
}

答案 5 :(得分:0)

如果您只想将非null元素放入数组中,则需要检查每个值。没有办法解决这个问题。

答案 6 :(得分:0)

我会选择以下两个选项之一:

1.正如其他人建议的那样,为要检查null的类型实现扩展方法。

2.如果您不能/不想使用扩展方法,您可以在MyObject中定义一个接受对象的辅助方法,并基本上进行相同的空检查。

string Check(object o)
{
    return o == null ? null : o.ToString(); 
}

然后,您将使用此方法调用包装所需的每个属性。

foreach(MyObject o in MyObjectList)
    string[] myArray = new string[] {o.id, o.Check(o.number), o.whatever, ...}