C # Расширения - PullRequest
       23

C # Расширения

2 голосов
/ 22 октября 2008

Я обычно очень редко использую методы расширения. Когда я чувствую необходимость написать метод расширения, я иногда хочу перегружать метод. Мой вопрос: что вы думаете о методах расширения, вызывающих другие методы расширения? Плохая практика? Это неправильно, но я не могу понять, почему.

Например, второй метод CaselessIs вызывает первый:

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (s.CaselessIs(comparison))
        {
            return true;
        }
    }

    return false;
}

Было бы более уместно не делать этого? Недостатком было бы то, что это нарушает СУХОЙ.

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (string.Compare(s, comparison, true) == 0)
        {
            return true;
        }
    }

    return false;
}

Ответы [ 5 ]

9 голосов
/ 22 октября 2008

Я бы сказал, что СУХОЙ контролирует здесь. Лично я не вижу ничего плохого в том, что метод расширения вызывает другой метод расширения, особенно если это другое расширение содержится в той же сборке. В общем, вызовы методов просто переводятся компилятором из:

extended.ExtensionMethod(foo);

до:

StaticType.ExtensionMethod(extended, foo);

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

3 голосов
/ 22 октября 2008

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

2 голосов
/ 22 октября 2008

Совершенно верно. Почему это должно быть неправильно?

Когда вы определяете метод расширения, вы неявно ориентируетесь на фреймворк 3.0 (фактически это расширения компилятора новых языков), поэтому нет ничего плохого в том, чтобы использовать просто другое расширение для работы.

В комментариях нет ничего плохого в любой версии, даже если «другое» расширение было в другой библиотеке, по крайней мере, в смысле «использования» расширения из другой. Расширения - это всего лишь функция синтаксиса, которая помогает лучше понять основную логику между кодом, добавляя некоторые классические операции к классу ... на самом деле это просто маскированные вызовы методов, и таким образом вы должны применять точно такое же ограничение, которое используете с вызовами методов.

1 голос
/ 22 октября 2008

Я не вижу в этом ничего плохого. Допустим, вы создали someClass.ToMySpecialString (). Почему вы не сможете перегрузить его, если у someClass.ToString () уже есть несколько перегрузок?

1 голос
/ 22 октября 2008

У меня нет с этим никаких проблем - хотя, если это заставит вас чувствовать себя лучше, вы могли бы вместо этого использовать статическую версию:

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
   foreach(string comparison in compareTo)
   {
      if (Extensions.CaselessIs(s, comparison))
      {
         return true;
      }
   }

   return false;
}

Лично в этом примере я бы назвал это CaselessMatches, и у меня было бы единственное число во множественном числе ... но я думаю, это просто придирчиво.

...