当试图弄清楚字符串是空还是空时,我通常已经有了字符串。这就是为什么我希望像String.IsNullOrEmpty()这样的实用函数在没有参数的情况下工作的原因:
String myString;
bool test=myString.IsNullOrEmpty();
但是,这不起作用,因为IsNullOrEmpty需要String参数。相反,我必须写:
String myString;
bool test=String.IsNullOrEmpty(myString);
为什么会这样?这似乎不必要地笨重。当然我可以轻松地为此编写自己的扩展方法,但这似乎是一个非常明显的遗漏,所以我想知道是否有任何好的理由。我无法相信微软已经忘记了这个功能的无参数重载。
答案 0 :(得分:27)
在将扩展方法添加到C#之前,这个方法已经存在很久了,在扩展方法之前,没有办法定义xyz.IsNullOrEmpty()
的实例方法/属性,如果xyz
仍然可以调用它} null
。
答案 1 :(得分:27)
如果字符串为null
,则调用IsNullOrEmpty()
会导致NullReferenceException
。
String test = null;
test.IsNullOrEmpty(); // Instance method causes NullReferenceException
现在我们有扩展方法,我们可以使用扩展方法实现它并避免异常。但总是要记住,这只能起作用,因为扩展方法只不过是静态方法的语法糖。
public static class StringExtension
{
public static Boolean IsNullOrEmpty(this String text)
{
return String.IsNullOrEmpty(text);
}
}
使用此扩展方法,后续操作永远不会抛出异常
String test = null;
test.IsNullOrEmpty(); // Extension method causes no NullReferenceException
因为它只是语法糖。
StringExtension.IsNullOrEmpty(test);
答案 2 :(得分:5)
在C#3.0和扩展方法之前,无法在null对象上调用方法。
答案 3 :(得分:3)
没有实例方法的原因是因为如果字符串确实为null,则会抛出myString.IsNullOrEmpty。
答案 4 :(得分:2)
我创建了一个扩展方法--InNothing - 它不仅会检查它是null还是空,还只包含空格。
public static bool IsNothing( this string source )
{
if (source == null || source.Length == 0)
{
return true;
}
else if (source.Trim().Length == 0)
{
return true;
}
return false;
}
答案 5 :(得分:1)
虽然完全有可能(并且有效)定义一个扩展方法来实现这一点,但我会担心它在语法上看起来很奇怪,因为出现是一个对象的方法调用这可能是空的。
YMMV,但我会坚持使用String.IsNullOrEmpty
。
答案 6 :(得分:0)
你可以在C#3.0中实现这一点:
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
然后,这将有效:
test.IsNullOrEmpty();
<强> BUT 强>
重要的是要知道很多人认为这是不好的做法。这是因为它违反了用户的期望。谨慎使用。
答案 7 :(得分:0)
如果您正在添加扩展方法或帮助方法来测试字符串,您可能还想添加一个修剪字符串的方法,以及我们大多数人在许多情况下也不希望字符串具有空格等作为标签或空格。
这是我们的测试方法之一
public static bool IsTrimStringNullOrEmpty(string value)
{
if(value == null)返回true;
if(value.Trim()== string.Empty)返回true;
返回false;
}
OR
如果你想测试这个值并且如果NotNullOrEmpty
同时修剪它 public static bool IsTrimStringNullOrEmpty(ref string value)
{
if(value == null)返回true;
value = value.Trim();
if(value == string.Empty)返回true;
返回false;
}