C# string.IsNullOrEmpty()与string.NotNullOrEmpty()的比较
我很好奇是否有开发人员在使用string.IsNullOrEmpty()时经常使用负数而不是正数 e、 gC# string.IsNullOrEmpty()与string.NotNullOrEmpty()的比较,c#,.net,string,C#,.net,String,我很好奇是否有开发人员在使用string.IsNullOrEmpty()时经常使用负数而不是正数 e、 g 我99%的时间都是这样使用这个方法的。设计决定是什么?这是我见过的最常见的用法 C#命名约定规定您的表达式应为正数,例如“Is…”而不是“IsNot…” 编辑:通常,我在方法开头执行错误检查和输入验证时使用它,如果参数为null或空,则引发异常 if(string.IsNullOrEmpty(myParameter)) { 抛出新… } 在命名东西时通常不鼓励双重否定!string.No
我99%的时间都是这样使用这个方法的。设计决定是什么?这是我见过的最常见的用法 C#命名约定规定您的表达式应为正数,例如“Is…”而不是“IsNot…” 编辑:通常,我在方法开头执行错误检查和输入验证时使用它,如果参数为null或空,则引发异常
if(string.IsNullOrEmpty(myParameter))
{
抛出新…
}
在命名东西时通常不鼓励双重否定<代码>!string.NotNullOrEmpty(…)就可以了。因为“IsNullOrEmpty”比“NotNullOrEmpty”更容易理解。后者可以解释为:
就我个人而言,我更倾向于首先迎合非否定情景。对我来说,先做正确的部分,然后再做错误的部分是有意义的。归结到个人风格。可能是因为这样名称就必须是冗长的
isnotnull和notempty
才能具体化。我更喜欢扩展方法:
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
我觉得最好说:
if(myValue.IsNullOrEmpty())
或
我一直认为这似乎是错误的,因为我使用消极的方式比使用积极的方式要多得多
我还希望有一个实例IsEmpty()或IsNotEmpty(),以便在函数中声明变量时使用。这不能是IsNullOrEmpty()或IsNotNullOrEmpty(),因为如果实例为null,那么您将得到一个null引用异常。对于那些逻辑学家来说!string.IsNullOrEmpty不等同于string.IsNotNullOrEmpty@Guffa说得对。使用DeMorgan定律,它必须是string.IsNotNullAndNotEmpty才能等效 (无效)∨ 空的)⇔ -无效∧ 空的 (无效)∨ 空的)≠ -无效∨ 空的 我想,这里的要点是,它目前的方式是明确的,而将相反的方式明确化将是很麻烦的。“NotNullOrEmpty”是模糊的,它可能意味着“(notnull)或空”,也可能意味着“not(null或空)”。为了使它明确,你必须使用“NotNullAndNotEmpty”,这是一个满嘴的单词 另外,“IsNullOrEmpty”命名鼓励用作保护子句,我认为这很有用。例如:
if (String.IsNullOrEmpty(someString))
{
// error handling
return;
}
// do stuff
我认为这比:
if (!String.IsNullOrEmpty(someString))
{
// do stuff
}
else
{
// error handling
return;
}
事实上,我倾向于提供一个不同于其他几个人提供的“这是不明确的”解释的答案(尽管我也同意这个答案): 就个人而言,我喜欢最小化代码中的嵌套,因为(对我来说)代码中的花括号越多,就越难理解 因此,我更喜欢这个(例如): 为此:
public bool DoSomethingWithString(string s) {
if (!string.IsNullOrEmpty(s)) {
// here's the important code, nested
} else {
return false;
}
}
这是一个非常特殊的场景(null/空字符串提示立即退出),显然不是使用
IsNullOrEmpty
的方法的构造方式;但我认为它实际上相当普遍。我总是为“hascantent()”创建一个扩展方法,它通常是有意义的,遵循“积极”规范,并节省代码膨胀,因为我使用它的频率比它的对应方高得多:
public static bool HasContent(this string s) {
return !string.IsNullOrEmpty(s);
}
当然,您现在可以使用
string.IsNullOrWhiteSpace(string)
,而不是.NET4.0中的string.IsNullOrEmpty(string)
在我意识到翻转问题所需做的只是将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);
}
我认为布尔结果的方法应该是“积极的”,因为它们应该使用“是…”而不是“不是…”。。。我只是想知道为什么会这样。@Johannes是的……绝对肯定!为什么微软觉得有必要增加额外的膨胀?呃..怎么会膨胀?如果有什么区别的话,你对单词“bloat”的多余使用“extra”对我来说听起来像是膨胀了……请查看代码中99%的IsNullOrEmpty()调用,并尝试应用“用保护子句替换嵌套的条件语句”重构。实际上,我们的代码库中有一个人将变量命名为“isNotGuam”。在Delphi中,试图破译“如果不是”的意思总是很有趣的,如果(!string.NotNullOrEmpty(..){}否则{//gooooo!}你不必把动词变成否定的,这是一个坏主意example@Dan:你实际上可以+“丹:我想那只是哲学。。。只要方法名中的值.IsNull()、值.ThrowIfNull()或值.IsNullOrEmpty()是明确的,我对在null上工作的扩展方法没有问题.但是你对专门命名为Null的扩展方法怎么看?我相信Bob叔叔可能会不赞成,但我不认为如果我们做foo.IsNull(),天会塌在我们头上-我会说你想做的很明显achieve@Brian我明白你的意思。就我个人而言,我认为对一个未统计的变量调用方法永远不会让我感到舒服,因为我认为它开创了一个不安全的先例。另一方面,我很失望我们不能创建静态扩展方法——我希望能够编写
AType.IsNullOrEmpty(aVar)代码>更多类型。谢谢。我在想这个最好的名字。我提出了“HasValue”和“IsPopulated”,但HasContent可能比两者都好。为了简洁易读,我还添加了一个IsEmpty()扩展方法。我知道人们可能会抱怨没有使用Null这个词,但我对string类的这个例外感到高兴。
public bool DoSomethingWithString(string s) {
if (!string.IsNullOrEmpty(s)) {
// here's the important code, nested
} else {
return false;
}
}
public static bool HasContent(this string s) {
return !string.IsNullOrEmpty(s);
}
// 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);
}