String.Split()方法在.NET中是否可能返回null?

32
< p > System.String.Split()方法是否会返回null?(.NET)< /p> < p >我知道我之前一直认为它不会返回null,但是在阅读文档后我没有看到这样的说明。鉴于文档中没有这样的说法,我想问一下社区的经验,有没有人真正遇到过string.Split返回null的情况?< /p>

2
想想 Split 做了什么。答案就在你面前。 - asawyer
是的,在回顾过去,这应该是显而易见的。哦,好吧,现在撤回已经太晚了。 :) - Tim Lovell-Smith
3
@asawyer 五年后,我很好奇他面前的答案怎样了? - eaglei22
@eaglei22 Split 意味着将字符串分成 n 个部分,其中 n 总是一个整数,整数永远不会为 null。在大多数情况下,我希望抛出异常而不是返回 null,在对 null 字符串调用 split 的情况下,实际上就是这种情况。它返回一个可变数组,本身可以为 null,这是 .Net 2.0 泛型时代之前的遗留问题。请参见 https://blogs.msdn.microsoft.com/ericlippert/2008/09/22/arrays-considered-somewhat-harmful/。 - asawyer
1
@eaglei22 如果有人评论说“答案就在你眼前”,而又不给出答案,那就是卖萌。这并不是一个愚蠢的问题。如果是的话,那么我想我们都很蠢才会降落在这个页面并点赞。请注意:如果你的字符串为null,那么它会像调用任何null对象的方法一样抛出异常。如果没有找到分隔符进行分割,则最终将得到一个仅包含一个元素的数组——整个字符串的值(这个值永远不可能为null)。 - MikeTeeVee
4个回答

47

不,它不能返回null。如果你查看它的源码,甚至可以通过代码合同来保证:

public String[] Split(params char[] separator) {
    Contract.Ensures(Contract.Result<String[]>() != null);

所有公共重载方法也提供了相同的保证。


26
不,它不会返回null。如果分隔符不存在,则返回整个字符串。
来自MSDN
如果此实例不包含分隔符中的任何字符串,则返回的数组包含一个元素,其中包含此实例。如果分隔符参数为null或不包含字符,则假定空格字符为分隔符。

2

不,我找不到任何 string.Split() 返回 null 的情况。它可以返回:

  • 包含一个或多个字符串的数组。
  • 使用 StringSplitOptions.RemoveEmptyEntries 删除条目后返回空(零长度)数组。
  • 仅当要拆分的字符串为 null 时,抛出 NullReferenceException

这些似乎是所有可能的结果。让我们通过一些场景来运行一下。首先假设我们有:

public static void WriteArray(string[] values)
{
    Console.Write("[");
    foreach(var item in values)
    {
        Console.Write($"'{item}' ");
    }
    Console.Write("]");     
}

private static char[] comma = new char[] { ',' };

然后我们从例如中获得了什么?
var source = "a,b,c";
WriteArray(source.Split(comma));

这当然是个成功案例,数组是['a' 'b' 'c' ]。现在让我们尝试使用坏的输入来破坏它:

string source = null;时,我们会得到Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

但是其他值不会破坏string.Split,它们会返回一个有一个或多个元素的数组

"a,b,c":     ['a' 'b' 'c' ]
"a,b,c,":    ['a' 'b' 'c' '' ]
"a, b, c":   ['a' ' b' ' c' ]
"abc":       ['abc' ]
"a,b":       ['a' 'b' ]
"a":         ['a' ]
"":          ['' ]
" ":         [' ' ]
",":         ['' '' ]
",,":        ['' '' '' ]
"a,":        ['a' '' ]

您可能不想要这些空条目,因此让我们再次尝试使用

WriteArray(source.Split(comma, StringSplitOptions.RemoveEmptyEntries));

现在我们总是得到零个或多个元素的数组

"a,b,c":     ['a' 'b' 'c' ]
"a,b,c,":    ['a' 'b' 'c' ]
"a, b, c":   ['a' ' b' ' c' ]
"abc":       ['abc' ]
"a,b":       ['a' 'b' ]
"a":         ['a' ]
"":          []
" ":         [' ' ]
",":         []
",,":        []
"a,":        ['a']

注意:在两种情况下都没有对前导/尾随空格进行字符串修剪 - 即a,b的输出与a,b不相同;但是您也可以使用StringSplitOptions.TrimEntries来处理这个问题。
例如:
    string source = "  a,, b,  c , ";
    WriteArray(source.Split(comma, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries));

显示

 ['a' 'b' 'c' ]

2

无法返回,请确保您的属性不为空

if (property != null)
{
    string[] splitData = sampleObject.property.Split(new char[] { ',' },
    StringSplitOptions.RemoveEmptyEntries);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接