2008-10-22 82 views
2

我通常非常謹慎地使用擴展方法。當我感覺不得不寫一個擴展方法時,我有時想重載這個方法。我的問題是,你對擴展方法調用其他擴展方法有什麼想法?不好的做法?感覺不對,但我無法真正定義原因。C#擴展

例如,第二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; 
} 

難道是比較合適不這樣做呢?不利的一面是它違反了DRY。

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; 
} 
+0

「CaselessIs」不是一個非常直觀的函數名稱。我建議也許將其更改爲「CompareCaseless」 – 2008-10-22 18:55:54

回答

9

我會在這裏說,幹管制。就我個人而言,我發現調用另一個擴展方法的擴展方法沒有問題,特別是如果其他擴展包含在同一個程序集中。所有功能於一切,方法調用只是翻譯的編譯器:

extended.ExtensionMethod(foo); 

到:

StaticType.ExtensionMethod(extended, foo); 

我沒有看到鏈接兩個靜態方法在一起的任何問題,所以及物動詞,我沒有看到鏈接兩個擴展方法的問題。

3

我個人不認爲有問題的話,我認爲第二個方案感覺更錯了....

1

我有沒有問題,我自己 - 不過,如果它讓你感覺更好,你當然可以使用,而不是靜態版本:

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,並有單數呼叫複數......但這只是nitpicky,我想。

2

完全正確。爲什麼它應該是錯的?

當您定義的擴展方法你implictily針對3.0框架(實際上是新的語言的編譯器擴展),所以沒有什麼錯只用另一部分做的工作。

審查意見有什麼不對任何版本,甚至沒有如果「其他」擴展名是在另一個庫,至少不是「用」一個從另一個延伸感。擴展只是一種語法功能,它有助於更​​好地理解代碼之間的基礎邏輯,將一些常見操作添加到類中......實際上,它們只是對方法的屏蔽呼叫,因此應該使用與您使用的限制完全相同的限制與方法調用。

1

我沒有發現任何問題。假設您創建了一個someClass.ToMySpecialString()。爲什麼你不能重載它,如果someClass.ToString()已經有多個重載?