何时使用!()或!=如果不为null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了何时使用!()或!=如果不为null相关的知识,希望对你有一定的参考价值。

虽然重构代码我改变了所有if not null条件,以遵循我的代码中的多数约定

if (!(foo == null))

代替

if (foo != null)

这两种说法都有什么优势吗?

在c#中的任何一个语句中都有任何优势吗?

答案

我发现第二个更具可读性。

除此之外,没有区别。

与团队一起选择约定并在任何特定代码库中坚持使用它更为重要。

另一答案

假设你没有破坏== / !=运算符重载,我只是使用第二种形式以获得简单/可读性。如果你确实已经破坏了重载,那么两者之间存在语义差异,那么我建议修复那些重载:)

在罕见的情况下,foo == null更清楚地表明了某些东西,我可能会重构它以使用局部变量:

bool somethingIsMissing = foo == null;
if (!somethingIsMissing)
{
    ...
}

围绕foo == null的圆括号现在是可选的 - 根据口味使用或不使用。主要的是你可以使用变量名来使语义清晰。

另一答案

例如,当您有更多变量要考虑时,通常会使用qazxsw poi

if (!(foo == null))

有时这种方式更容易将所有内容转换为相反的方式,特别是在使用按位运算符时。

另一答案

第一个使用两个运算符,第二个使用一个。从技术上讲,第二个更简单。

另一答案

我将使用if (!(f1 == 'a' && f2 != 'b')) 的唯一地方就像这样在!(a == b)的运算符实现中:

!=
另一答案

在我看来,没有区别,编译器无论如何都会优化代码。但我更喜欢public static bool operator != (MyType a, MyType b) { return !(a == b); } 。括号少,易于阅读。

另一答案

我首选的是第二个,因为它比第一个更易读。

他们没有任何区别,所以这只是你的选择。

但是,如果if子句中有许多其他变量,则第一个可能是要使用的变量。

你的选择到底。

另一答案

因为,第一种形式使用2对1 C#运算符,它可能编译为更多的CIL代码,尽管在大多数用例中大多数会遇到,它可能不会产生显着的代码大小或性能差异。

可能产生显着差异的是可读性,因此在编写/修改时出现错误的可能性。我愿意(而你谢尔顿现在可能想要遮住你的眼睛)避免使用“!”运营商com-PLETELY。 “喘息!我 - 你的话!”是的,我说了。我明白了!充满激情!它很容易被遗漏,因为它通常旁边是一个看起来相似的标点字符(即左边的“(”)和右边的类似标识字母(即“我”)。并且错过它可能会产生严重的后果,因为这意味着你认为代码正在做它实际正在做的事情的确切对立!它也可能更有可能被诵读困难所遗漏,使得它可能成为受ADA保护的残疾人权利问题。

考虑以下非常可能的例子:

if(foo != null)

我会写下面的内容:

   if (!IsIisServerConnected)
   if (IsOfflineMode || !(IsIisLocalServerConnected || IsIisCloudServerConnected))

或者在你的情况下:

   if (false.Equals(IsIisServerConnected))
   if 
   (
     IsOfflineMode 
     || false.Equals
     (
         IsIisLocalServerConnected 
         || IsIisCloudServerConnected
     )
   )

请记住,C(C#,C ++,javascript,Java和许多其他当前流行语言最终继承其基本语法的语言)是在Punch Cards仍然常见的时候创建的。使用现代CPU,RAM,显示器和IDE(可以使用自定义键盘快捷键生成“false.Equals(?)”代码段),对于大多数应用程序的大多数人来说,可读性非常多,很多(我提到过“ “?”比保存一些代码字符更重要。

附:您还可以向 if (false.Equals(foo == null)) Struct添加一个扩展方法来调用它,哦,我不知道,Boolean! ; D所以你可以写:

Not

以上是关于何时使用!()或!=如果不为null的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从 2 列中选择数据,如果它不为 NULL,则插入到视图中

Mongoose:唯一字段,如果它不为 null 或空字符串 [重复]

如何检查 LocationServices.FusedLocationApi.getLastLocation() 何时不为空?

何时使用 NaN 或 +/-Infinity?

为啥使用片段,以及何时使用片段而不是活动?

何时使用或何时不使用malloc函数?学数据结构有感