[英]Using String.Contains on a Null value string
在我的应用程序中,我从 Active Directory 获取描述,然后将其分配给一个字符串,以便我稍后可以检查该字符串是否为“Contracted”以忽略该用户。
问题是并非所有用户在描述字段中都有一个值,这会导致抛出Null Reference Exception
。 我能想到的唯一方法是使用String.IsNullOrEmpty
添加另一个检查并添加一个临时值,然后删除该临时值。 这看起来既麻烦又错误。
在检查期间我需要做什么来处理字符串中的null
? 我尝试了以下两组代码,都抛出错误:
var userDescription = (string)userDirectoryData.Properties["description"].Value;
if (userDescription.Contains("Contracted"))
{
continue;
}
else
{
//Do Stuff here
}
和
var userDescription = (string)userDirectoryData.Properties["description"].Value;
if (userDescription.IndexOf("Contracted") > -1)
{
continue;
}
else
{
//Do Stuff here
}
编辑:根据https://msdn.microsoft.com/en-us/library/k8b1470s.aspx我不能设置为 String.Empty 因为这将返回“0”的结果导致误报描述只包含“签约”。
如果值为空,则使用 c#可空合并分配一个空字符串:
var userDescription = (string)userDirectoryData.Properties["description"].Value ?? String.Empty;
if (userDescription.Contains("Contracted"))
{
continue;
}
else
{
//Do Stuff here
}
有点复杂的 C# 6.0 语法?.
(而不是.
在userDescription.Contains
)可以使用
if (userDescription?.Contains("Contracted") == true) {
continue;
}
else {
// Do Stuff here
}
不幸的是(在这种特殊情况下) Boolean?
不能隐式转换为Boolean
,这就是应该添加== true
的原因。 在IndexOf
的情况下,代码看起来很不错:
if (userDescription?.IndexOf("Contracted") > -1) {
continue;
}
else {
// Do Stuff here
}
您可以覆盖Contains()
和IndexOf
并定义自定义输出,以防字符串为空,如下所示:
public static class Extensions
{
public static bool Contains(this string value, string search)
{
if(value != null)
{
return value.Contains(search);
}
else
{
// IF ITS NULL DEFINE YOUR RETURN HERE
}
return false;
}
public static int IndexOf(this string value, string search)
{
if(value != null)
{
return value.IndexOf(search);
}
else
{
// IF ITS NULL DEFINE YOUR RETURN HERE
}
return -1;
}
}
除了具有空值的行为外,用法保持不变。 检查我的评论。
在 C# 6 之前使用string.IsNullOrEmpty
(或 James Dev 的回答)是必要的
var userDescription = (string)userDirectoryData.Properties["description"].Value;
if (!string.IsNullOrEmpty(userDescription) && userDescription.IndexOf("Contracted") > -1)
{
continue;
}
else
{
//Do Stuff here
}
使用 C# 6,您可以将其简化为空传播运算符 ( ?.
):
if ((string)userDirectoryData.Properties["description"].Value?.IndexOf("Contracted") > -1)
{
continue;
}
else
{
//Do Stuff here
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.