[英]C# - overloaded extension methods
在一個相當基礎的學習練習中,我使用了LinkedList,並且當需要返回最后一個元素時,我錯誤地使用了Last()方法代替了Last屬性,然后我開始懷疑。
此方法是IEnumerable的擴展方法,因此,如果未重載(Visual Studio + Resharper將向我顯示該方法的基本IEnumerable擴展方法簽名),則效率將非常低下。
LinkedList MSDN頁面將大多數擴展方法指定為“重載”。 但是我不確定這是什么意思(單擊方法鏈接會顯示基本方法的說明),為什么Visual Studio + Resharper不會向我顯示它。
謝謝。
with over . 一個容易犯的錯誤是在與混淆過 。 當MSDN頁面上說方法已重載時,這意味着方法的多個版本具有不同的參數。
您不能覆蓋擴展方法,因為它們是靜態的。
從技術上講,您不能“替代”擴展方法,因為它們是靜態的。 但是,如果類或接口上的方法與擴展方法具有相同的簽名,則編譯器將首選類或接口方法,而不是擴展方法。 所以通常以下行:
list.LastOrDefault()
...實際上將被編譯為:
Enumerable.LastOrDefault(list);
但是在下面的代碼中:
public class LinkedList2<T> : LinkedList<T>{
public T LastOrDefault() {
return Last.Value;
}
}
...
var list = new LinkedList2<int>();
list.LastOrDefault();
編譯器實際上將調用LinkedList2.LastOrDefault()
而不是Enumerable.LastOrDefault<T>(this IEnumerable<T>)
。
但是,由於LinkedList沒有Last()
或LastOrDefault()
方法,您最終將調用效率非常低的Enumerable.Last()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.