C #: методы расширения и оператор Not - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть массив строк, и я хочу выяснить, не содержит ли этот массив определенную строку.Я могу использовать оператор 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 ]

4 голосов
/ 01 декабря 2010

Лично я бы не стал делать метод расширения для чего-то такого простого. Я понимаю, что вы пытаетесь сделать его читабельным, но большинство разработчиков на C # должны это понять оператор. Он активно используется, и даже новички обычно узнают его.

3 голосов
/ 01 декабря 2010

Я думаю, что ваш вопрос основан на некоторой ошибочной предпосылке. А именно, что разработчики будут читать за ! в вашем коде. Логический оператор ! является очень известным оператором во многих популярных языках программирования (C, C ++, C #, Java и т. Д.). Любой, кто, вероятно, будет регулярно читать за !, вероятно, не будет проверять код без тщательного анализа.

Такое чувство, что ты говоришь следующее

Я хочу, чтобы люди писали код на C #, но я не доверяю им читать его, поэтому я собираюсь создать новый диалект в моей базе кода с помощью методов расширения.

Зачем останавливаться на операторе !? Представляется также вероятным, что они пропустят выражение + in += или прочитают | как ||.

3 голосов
/ 01 декабря 2010

Храните! Именно здесь комментарий над строкой поможет улучшить читаемость.
(я подозреваю! Более эффективно)

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

Еще один вопрос: неужели вы не используете Массив? Есть что-то (о чем вы можете знать или не знать) под названием HashSet.

Если ваша единственная цель состоит в том, чтобы проверить, есть ли строка в списке, вы, по сути, смотрите на арифметику множества.

Если вы не используете массив для чего-то другого, кроме выяснения, есть ли в нем определенный термин, попробуйте использовать HashSet ... намного быстрее.

3 голосов
/ 01 декабря 2010

Я бы определенно использовал !stringArray.Contains(string).Это то, что используют 99,9% всех разработчиков.DoesNotContain смутил бы меня по крайней мере.

3 голосов
/ 01 декабря 2010

Кажется ненужным, !source.Contains<T>(value); довольно читабельно.Кроме того, использование существующей функции Contains означает, что ваш код будет более переносимым (т. Е. Он не будет зависеть от наличия вашего метода расширения).

2 голосов
/ 01 декабря 2010

Это звучит как плохая идея, теперь потребители вашего кода должны знать о двух методах (DoesNotContain и Contains) вместо одного.В общем, я бы избегал методов XXNotXX.

2 голосов
/ 01 декабря 2010

Я думаю, это личный выбор, а не хорошая / плохая практика.IMO Мне нравятся методы расширения, поскольку они более декларативны и, следовательно, более читабельны, на первый взгляд, вы точно знаете, что он делает.Просто мои 2 цента

2 голосов
/ 01 декабря 2010

Никогда не видел методы DidNot * в .NET Framework, поэтому я думаю, что ваша проблема с!завышен.

1 голос
/ 01 декабря 2010

Я бы на самом деле считал методы расширения, которые не делают ничего, кроме отрицания выражения, плохой практикой.

А как же:

if (stringArray.Contains(searchString) == false)
{
    //do something
}
1 голос
/ 01 декабря 2010

Я предпочитаю вариант 1, а не вариант 2. Методы расширения очень полезны и отлично подходят для таких часто используемых преобразований или сравнений.Однако Microsoft рекомендует экономно использовать методы расширения.

...