2009-11-26 83 views
2

擴展方法在C#中遵循面向對象的範例嗎?擴展方法是C#的面向對象的特性嗎?

使用擴展方法是否是一種很好的做法?

在軟件開發生命週期中,我們應該如何在設計階段考慮這個問題?

+0

聽起來像 「如果它不是面向對象的,我們不應該使用它。」 – 2009-11-26 09:05:42

+0

噪音 - 這在SO上被問過很多次 – 2009-11-26 09:34:12

回答

0

擴展方法只是一種語言功能。他們在對象實例上工作,是非常好的工具。

將它們視爲擴展類功能的另一種方法。通過增加部分類聲明

  • :您可以添加一個類的新功能。然後該類立即獲得一堆新的方法和屬性。

  • 通過在您的擴展方法持有者類中包含名稱空間。然後該類再次獲得一堆新的方法。

而是一個組織/語言功能。不以任何方式打破面向對象的概念。正如C/C++中的頭文件/源文件除法與面向對象無關,只是語言/框架功能。

0

這取決於。擴展方法只是一個工具。如果使用得當,它們可能非常有用。但是,如果你使用它們太多,它會掩蓋你的代碼。

2

有兩部分。

  1. 使用它時是否OO 否;它讓你覺得你是在特定類型的

  2. 難道OO基於它是如何編譯調用方法/內置

是;編譯的代碼具有使用在其上調用擴展方法

0

擴展方法只是與特定類或類層次工作靜態方法的對象的靜態方法。 Python是OO,但有模塊,Ruby有mixin。我更多地將它看作一種語言功能。我敢肯定它仍然OO友好

7

埃裏克利珀有blogged about this,我懷疑我不能做的更好,而不是引用他的話:

所以,是的,經常聽到批評 「延伸方法不是 面向對象「是完全正確的,但也相當無關。擴展 方法肯定不是 面向對象的。他們把操縱數據遠 從聲明中的數據, 他們不能打破封裝和 再跟他們似乎是在, 他們不玩方法 對象的私有狀態以及與代碼的代碼 繼承,等等。他們是在一個方便 面向對象的禮服 過程編程。

它們也非常方便, 使LINQ成爲可能,這就是爲什麼我們 添加它們。事實上,他們不 符合一些哲學理想 是什麼使面嚮對象語言 並不是真正的因素在 該決定。

我會然而補充一點,他們不僅僅是LINQ有用的 - 出於同樣的原因,他們是在LINQ有用。能夠表達能夠在特定接口的任意實現上工作的算法(如LINQ to Obhects中的IEnumerable<T>)真的很棒。這樣的算法通常沒有任何超出您正在處理的接口的上下文,所以它們通常自然是靜態的。

如果你接受你有一些靜態工具方法,你寧願使用哪種語法?

// Traditional 
CollectionUtils.Sort(collection); 

// Extension methods 
collection.Sort(); 

後者在我看來只是更具可讀性。它簡潔地表達你想要做的事情。它並沒有說清楚你想怎麼做,但這對於大多數來說並不重要 - 當然,當你調試某一行時更重要。