string.IsNullOrEmpty()vs string.NotNullOrEmpty()

我很好奇是否有任何开发人员使用string.IsNullOrEmpty()更频繁地使用负数而不是正数

例如

if (!string.IsNullOrEmpty()) 

这就是我99%的时间使用这种方法的方法。 对此有何设计决定?

因为“IsNullOrEmpty”比“NotNullOrEmpty”更容易理解。 后者可以解释为:

  1. 它不是空的,它不是空的
  2. 它不是null或它是空的

在命名内容时通常不鼓励双重否定。 !string.NotNullOrEmpty(...)会成为一个。

对于那些逻辑学家来说,!string.IsNullOrEmpty不等同于string.IsNotNullOrEmpty。 @Guffa说得对。 使用DeMorgan定律,它必须是string.IsNotNullAndNotEmpty才是等价的。

¬(null∨empty)⇔¬null∧¬empty

¬(null∨empty)≠¬null∨空

我想,这里的观点是,它目前的方式是明确的,因为相反的明确将是繁琐的。

C#命名约定规定你的表达式应该是正面的,例如“Is …”而不是“IsNot ……”

编辑:通常,我在方法开始时进行错误检查和输入validation时使用它,如果参数为null或为空,则引发exception。

if (string.IsNullOrEmpty(myParameter))
{
throw new ....
}

正如旁注,我更喜欢扩展方法:

 public static class StringExtensions { public static bool IsNullOrEmpty(this string value) { return string.IsNullOrEmpty(value); } } 

我发现说起来更好:

 if(myValue.IsNullOrEmpty()) 

要么

 if(!myValue.IsNullOrEmpty()) 

我总是为“HasContent()”创建一个扩展方法,它通常是有意义的,遵循“正面”规范,并节省代码膨胀,因为我使用它比对应的更频繁:

 public static bool HasContent(this string s) { return !string.IsNullOrEmpty(s); } 

也许是因为那时名称必须是冗长的IsNotNullAndNotEmpty才具体。

当然你现在总是可以使用string.IsNullOrWhiteSpace(string)而不是.NET 4.0中的string .IsNullOrEmpty(string)

这是我见过的最常见的用法。

“NotNullOrEmpty”是不明确的,它可能意味着“(不为空)或空”或者它可能意味着“不(空或空)”。 为了使它明确无误,你必须使用“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)) 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的方法总是被构造的方式; 但我认为这实际上非常普遍。

就个人而言,我更愿意首先迎合非否定的情景。 对我来说,先做真正的部分,然后做假的,这才有意义。 归结为个人风格。

我一直认为这似乎是错误的方式,因为我更多地使用负面而不是正面。

我还想在函数中声明变量时使用实例IsEmpty()或IsNotEmpty()。 这可能不是IsNullOrEmpty()或IsNotNullOrEmpty(),就好像实例为null然后您将获得空引用exception。