我很好奇是否有任何开发人员使用string.IsNullOrEmpty()更多地使用负数而不是正数
e.g。
if (!string.IsNullOrEmpty())
这是我99%的时间使用该方法的方法。对此有何设计决定?
答案 0 :(得分:58)
因为“IsNullOrEmpty”比“NotNullOrEmpty”更容易理解。后者可以解释为:
答案 1 :(得分:36)
在命名内容时通常不鼓励双重否定。 !string.NotNullOrEmpty(...)
会成为一个。
答案 2 :(得分:12)
对于那些逻辑学家,!string.IsNullOrEmpty不等同于string.IsNotNullOrEmpty。 @Guffa说得对。使用DeMorgan定律,它必须是string.IsNotNullAndNotEmpty才能等效。
¬(null∨empty)⇔¬null∧¬empty
¬(null∨空)≠空∨空
我想,这里的观点是,它目前的方式是明确的,因为相反的明确是明显的。
答案 3 :(得分:6)
C#命名约定规定你的表达式应该是正面的,例如“Is ...”而不是“IsNot ......”
编辑:通常,我在方法开头进行错误检查和输入验证时使用它,如果参数为null或为空,则引发异常。
if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}
答案 4 :(得分:6)
正如旁注,我更喜欢扩展方法:
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
我觉得最好说:
if(myValue.IsNullOrEmpty())
或
if(!myValue.IsNullOrEmpty())
答案 5 :(得分:5)
我总是为“HasContent()”创建一个扩展方法,它通常是有意义的,遵循“正面”规范,并节省代码膨胀,因为我使用它比对应的更频繁:
public static bool HasContent(this string s) {
return !string.IsNullOrEmpty(s);
}
答案 6 :(得分:4)
也许因为那时名称必须是冗长的IsNotNullAndNotEmpty
才具体。
答案 7 :(得分:2)
当然,您现在可以始终使用string.IsNullOrWhiteSpace(string)
而不是.NET 4.0中的string .IsNullOrEmpty(string)
答案 8 :(得分:1)
这是我见过的最常见的用法。
答案 9 :(得分:1)
“NotNullOrEmpty”是不明确的,它可能意味着“(不为空)或空”或者它可能意味着“不(空或空)”。为了使它明确无误,你必须使用“NotNullAndNotEmpty”,这是一个满口的。
此外,“IsNullOrEmpty”命名鼓励使用作为保护条款,我认为这是有用的。 E.g:
if (String.IsNullOrEmpty(someString))
{
// error handling
return;
}
// do stuff
我认为通常比以下更清洁:
if (!String.IsNullOrEmpty(someString))
{
// do stuff
}
else
{
// error handling
return;
}
答案 10 :(得分:1)
我实际上倾向于从其他几个人提供的“它含糊不清”的解释中给出不同的答案(尽管我同意这个答案):
就个人而言,我喜欢在我的代码中最小化嵌套,因为(对我而言)代码花括号越多,就越难以遵循。
因此我更喜欢这个(例如):
public bool DoSomethingWithString(string s) {
if (string.IsNullOrEmpty(s))
return false;
// here's the important code, not nested
}
到此:
public bool DoSomethingWithString(string s) {
if (!string.IsNullOrEmpty(s)) {
// here's the important code, nested
} else {
return false;
}
}
这是一个非常具体的场景(其中null / empty字符串提示立即退出)并且显然不是使用IsNullOrEmpty
的方法总是被构造的方式;但我认为这实际上非常普遍。
答案 11 :(得分:0)
就我个人而言,我更愿意首先迎合非否定的情景。对我来说,先做真正的部分,然后做假的,这才有意义。归结为个人风格。
答案 12 :(得分:0)
我一直认为这似乎是错误的方式,因为我使用负面的次数远远超过正面。
我还想在函数中声明变量时使用实例IsEmpty()或IsNotEmpty()。这可能不是IsNullOrEmpty()或IsNotNullOrEmpty(),就好像实例为null然后你会得到一个空引用异常。
答案 13 :(得分:0)
我有一个相同的问题,然后才意识到我要翻转这个问题所要做的就是将Not运算符放在条件前面。我认为这可以清除我的代码。
// need to check if tBx_PTNum.Text is empty
/*
if (string.IsNullOrWhiteSpace(tBx_PTNum.Text))
{
// no pt number yet
}
else
{
ptNum = Convert.ToInt32(tBx_PTNum.Text);
}
*/
if(!string.IsNullOrEmpty(tBx_PTNum.Text))
{
ptNum = Convert.ToInt32(tBx_PTNum.Text);
}