C#:扩展方法和Not运算符最佳实践

时间:2010-12-01 16:43:48

标签: c# code-readability

我有一个字符串数组,我想知道该数组是否包含某个字符串。我可以将not运算符(!)与Contains方法结合使用,如下所示:

if (!stringArray.Contains(searchString))
{
    //do something
}

扫描代码时可能会忽略not运算符(!),因此我想知道创建Extension方法是否被认为是不好的做法,以提高可读性:

public static bool DoesNotContain<T>(this IEnumerable<T> source, T value)
{
    return !source.Contains<T>(value);
}

所以现在代码可以读取:

if (stringArray.DoesNotContain(searchString))
{
    //do something
}

这种事情不受欢迎吗?

12 个答案:

答案 0 :(得分:4)

就个人而言,我不会为这么简单的事情做出扩展方法。我知道你试图保持它的可读性,但大多数C#开发人员应该抓住它!运营商。它被大量使用,甚至初学者通常都会认出它。

答案 1 :(得分:3)

似乎没必要,!source.Contains<T>(value);非常易读。此外,使用现有的Contains函数意味着您的代码将更具可移植性(即,它不依赖于您的扩展方法存在)。

答案 2 :(得分:3)

我肯定会使用!stringArray.Contains(string)。这是99.9%的开发人员使用的。 DoesNotContain至少会让我感到困惑。

答案 3 :(得分:3)

保持!这是该行上方的评论有助于提高可读性的地方 (我怀疑!效率更高)

//If the word is NOT in the array then...

另一点是你是否在使用数组时死定? 有些东西(您可能知道或可能不知道)称为HashSet

如果您的唯一目的是检查字符串是否在列表中,那么您实际上是在查看集算术。

除非您将数组用于查找是否包含某个术语以外的其他内容,否则请尝试使用HashSet ...更快。

答案 4 :(得分:3)

我认为你的问题是基于一个错误的前提。也就是说,开发人员将阅读代码中的!!布尔运算符是众多流行编程语言(C,C ++,C#,Java等)中众所周知的运算符。任何有可能定期阅读!的人都可能不会在没有经过大量审核的情况下检查代码。

感觉就像你说的那样

  

我希望人们使用C#进行编码,但我不相信他们会阅读它,因此我将使用扩展方法在我的代码库中创建一个新的方言。

为什么要停留!运算符?他们似乎很可能会错过+表达式中的+=或将|作为||阅读。

答案 5 :(得分:2)

在.NET框架中从未见过DoesNot *方法,所以我认为你的问题!被高估了。

答案 6 :(得分:2)

我想这不仅仅是一种好/坏的做法,而是一种个人选择。 IMO我喜欢扩展方法,因为它更具说明性,因此更具可读性,乍一看你确切知道它的作用。只差我2美分

答案 7 :(得分:2)

这听起来不错,现在代码的消费者必须知道两种方法(DoesNotContainContains)而不是一种方法。一般来说,我会避免使用XXNotXX方法。

答案 8 :(得分:1)

如果我要在项目中经常使用它,我个人会为此做一个扩展方法。如果它是一个关闭然后我不会打扰,但它不是非常糟糕的做法。

我之所以这样做,是因为if()有更多的上下文,一目了然。好的,任何有脑细胞的人都会知道当前的声明在做什么,但它只是读得更好。每个人都会有自己的偏好......

我为格式化字符串做了一个扩展方法,只是为了让代码更好......

答案 9 :(得分:1)

!something无效时,请回到something == false

答案 10 :(得分:1)

我更喜欢选项1而非选项2.扩展方法非常酷,非常适合用于频繁使用的转换或比较。但是,Microsoft建议谨慎使用扩展方法。

答案 11 :(得分:1)

我真的会考虑扩展方法,除了将表达式否定为不良做法之外别无其他。

怎么样:

if (stringArray.Contains(searchString) == false)
{
    //do something
}