如果默认字符串为null,为什么我不能使用String.Contains()?

Tân*_*Tân 9 .net c# string

来自MSDN doc:

public bool Contains(
    string value
)
Run Code Online (Sandbox Code Playgroud)

返回值:如果value参数出现在此字符串中,或​​者value为空字符串(""),则返回true ; 否则,错误.

异常:ArgumentNullException:valuenull.

例:

string s = string.Empty; //or string s = "";
Console.WriteLine(s.Contains("Hello World!")); //output: False
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为:

try
{
   string s = null; //or string s;
   Console.WriteLine(s.Contains("Hello World!"));
}
catch (Exception e)
{
   Console.WriteLine(e.Message);
}
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误信息:Object reference not set to an instance of an object因为string没有默认值(如""从)默认值表(C#参考),

请回到示例,如果我声明代码将工作s:

string s = "";
Run Code Online (Sandbox Code Playgroud)

现在,Object s被设置为对象的实例.

所以,我的问题是:MSDN是否忘记了:s不能为

为了检查它,我尝试过:

string s = null;
Console.WriteLine(!string.IsNullOrEmpty(s) ? s.Contains("Hello World!") : false);
Run Code Online (Sandbox Code Playgroud)

它应该工作.

Him*_*ere 13

您使用实例更改了.

myString.Contains(anotherString)
Run Code Online (Sandbox Code Playgroud)

以下myString是调用方法的实例Contains,而传递给方法anotherString.如果这个值是null方法将抛出一个ArgumentNullException.

另一方面,当更改实例时,null它肯定会导致NRE,因为您无法在空引用上调用任何成员.但是,如果将其设置为string.empty Contains将返回,false因为空字符串不包含任何内容(特别string.empty是不包含"Hello World",但是"Hello world"包含空字符串).

所以返回以下内容false:

Console.WriteLine(string.Empty.Contains("Hello World"));
Run Code Online (Sandbox Code Playgroud)

虽然这会返回true:

Console.WriteLine("Hello World".Contains(string.Empty));
Run Code Online (Sandbox Code Playgroud)

无论如何,你要检查的是空字符串是否包含在任何其他字符串中:

var retVal = myString.Contains(string.empty);
Run Code Online (Sandbox Code Playgroud)

哪个应该回归true.

进一步myString.Contains(null)导致ArgumentNullException

在另一边null.Contains(aString)通向NRE.

  • 优秀的解释.+1 (3认同)

Mik*_*ike 5

新的编译器允许您通过简化的条件检查来完成。

string s = null;
Console.WriteLine(s?.Contains("Hello World!"));
Run Code Online (Sandbox Code Playgroud)