来自MSDN doc:
public bool Contains(
string value
)
Run Code Online (Sandbox Code Playgroud)
返回值:如果value参数出现在此字符串中,或者value为空字符串(""),则返回true ; 否则,错误.
异常:ArgumentNullException:value为null.
例:
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.
新的编译器允许您通过简化的条件检查来完成。
string s = null;
Console.WriteLine(s?.Contains("Hello World!"));
Run Code Online (Sandbox Code Playgroud)