C# 何时使用!()或!=如果不为null,则为when

C# 何时使用!()或!=如果不为null,则为when,c#,coding-style,C#,Coding Style,在重构代码时,我更改了所有if-notnull条件,以遵循我的代码中的多数约定 if (!(foo == null)) 而不是 if (foo != null) 这两种说法都有好处吗 c#中的任一语句有什么优点吗?我发现第二个语句更具可读性 除此之外,没有区别 更重要的是与您的团队一起选择一个约定,并在任何一个特定的代码库中坚持它。假设您没有破坏==/=运算符重载,为了简单性/可读性,我只使用第二种形式。如果您确实破坏了重载,以至于两者之间存在语义差异,那么我建议修复这些重载:) 在极少数情

在重构代码时,我更改了所有if-notnull条件,以遵循我的代码中的多数约定

if (!(foo == null))
而不是

if (foo != null)
这两种说法都有好处吗


c#中的任一语句有什么优点吗?

我发现第二个语句更具可读性

除此之外,没有区别


更重要的是与您的团队一起选择一个约定,并在任何一个特定的代码库中坚持它。

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

在极少数情况下,
foo==null
可以更清楚地指示某些内容,我可能会重构它以使用局部变量:

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

foo==null
周围的括号现在是可选的-根据口味使用或不使用。最重要的是,您可以使用变量名使语义真正清晰。

在我看来,没有区别,编译器无论如何都会优化代码。但是我更喜欢
如果(foo!=null)
。括号更少,更容易阅读。

例如,当需要考虑更多变量时,通常使用
如果(!(foo==null))

if (!(f1 == 'a' && f2 != 'b'))

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

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

我更喜欢的是第二个,因为它比第一个更清晰

它们没有区别,所以这只是你选择的问题

但是,如果在if子句中有很多其他变量,那么第一个变量可能就是要使用的变量


最后是您的选择。

我唯一会使用
的地方!(a==b)
将在
的操作员实现范围内=像这样:

public static bool operator != (MyType a, MyType b)
{
    return !(a == b);
}

由于第一种形式使用2个C#运算符和1个C#运算符,因此它可能会编译成更多的CIL代码,尽管在大多数用例中,大多数人都会遇到这种情况,但它可能不会造成显著的代码大小或性能差异

可能造成显著差异的是可读性,因此在编写/修改时出错的可能性。我会完全避免使用“!”操作符(你们谢尔顿人现在可能想捂住眼睛)。“喘息!我的话!”是的,我说了。我是认真的!带着激情!它很容易漏掉,因为它通常位于一个相似的标点符号(即左边的“(”或“||”)和一个相似的标识符字母(即“l”或“i”)旁边在右边。遗漏它可能会产生重大后果,因为这意味着你认为该代码与它实际所做的完全相反!而且它也可能更容易被诵读困难者遗漏,从而可能成为受ADA保护的残疾权利问题

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

   if (!IsIisServerConnected)
   if (IsOfflineMode || !(IsIisLocalServerConnected || IsIisCloudServerConnected))
我将写以下内容:

   if (false == IsIisServerConnected)

   if 
   (
     IsOfflineMode 
     || 
     (
       false ==
       (
         IsIisLocalServerConnected 
         || IsIisCloudServerConnected
       )
     )
   )
或者在您的情况下:

   if (false == (foo == null))
<>记住C(C语言,C++,JavaScript,java和许多其他当前流行语言最终继承了他们的基本语法)是在穿孔卡片仍然很常见的时候创建的。现代的CPU、RAM、监视器和IDE(用假键盘快捷方式生成的“false .ras(?)”片段),对于大多数人来说,对于大多数应用程序来说,可读性比保存几个代码字符更重要

另外,您还可以向
布尔
结构添加一个扩展方法,调用它,哦,我不知道,
Not
!;D,这样您就可以编写:

if (IsIisServerConnected.Not())
if ((foo == null).Not())

可读性是关键,因此当您使用相等运算符时,您应该将!=放在那里以使其更清楚。但是,当比较变得更复杂时,其他版本可能会更好

if((a!=b)和(a!=c))
if(!((a==b)或(a==c))
更清晰。但是,如果有返回布尔值的函数,例如
if!(a.valid())
if!(String.IsNullOrEmpty(a))

另外,如果等式表达式变得特别复杂,这也会影响可读性,那么最好将测试移到一个具有明确名称的函数上,如
if!(this.allsetingsvalid())

在C#8中,您现在可以编写“where value is something”

if(值为{})


它还与2021年将为所有内容启用的可空引用功能相匹配。

此外,当您在第一个场景中阅读代码时,您可以看到操作(等于或不等于),但在第二个场景中,它更“阅读友好”,您感觉像是单个操作。@Oded:Agree“第二个(稍微)更具可读性”相对于第一个,但是,依我所知,这太难理解了,因为我在下面的12/21/17的回答中提到了替代建议的原因。而且,通常是“约定”,根据当时的知识和情况,这可能是完全正确的,但根据新的知识和/或情况,这是完全不够的。@Tom我不同意,我认为你的答案需要更多的抽象,而不是从
改为
false.equals()
@ChrisRudd:拜托,伙计。你知道这不是我要说的重点。这只是一个例子,很容易会有无数其他的例子,这是一个非常合适的表达式形式(不需要转换为单个方法调用)当然,每个表达式最终都可以简化为一个方法调用和一个运算符表达式,但我认为大多数人会发现键入(在许多情况下)的性能,更重要的是,可读性