在我的应用程序中,我从 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”的结果,导致误报,描述仅包含“契约”。
如果值为 null,则使用 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
}