簡體   English   中英

在 .Net 中使用擴展方法的最佳實踐是什么?

[英]What are the best practices for using Extension Methods in .Net?

我已經看到這些被以各種方式使用,並被指責以錯誤的方式使用它們(盡管在那種情況下,我以這種方式使用它們來證明一點)。

那么,您認為使用擴展方法的最佳實踐是什么?

開發團隊是否應該創建一個擴展方法庫並將它們部署到各種項目中?

是否應該有一個開源項目形式的通用擴展方法的集合?

更新:已決定創建一個組織范圍的擴展方法庫

即將發布的框架設計指南第2版將為實現擴展方法提供一些指導,但總的來說:

您應該只定義擴展方法“它們具有語義意義”並提供與每個實現相關的輔助功能。

您還應該避免擴展System.Object,因為並非所有.NET語言都能夠將擴展方法作為擴展名調用。 (例如,VB.NET需要將其稱為靜態擴展類上的常規靜態方法。)

除非您擴展接口,否則不要在與擴展類型相同的命名空間中定義擴展方法。

不要使用與“真實”方法相同的簽名定義擴展方法,因為它永遠不會被調用。

您可能需要查看http://www.codeplex.com/nxlhttp://www.codeplex.com/umbrella這兩個擴展方法庫。 我個人還沒有看過源代碼,但我相信那些人能夠給你一些好的指針。

我一直在Utils類中將我的擴展方法包含在我的Core庫中,因為使用我的框架的人可能會發現這些方法很有用,但對於大規模部署,最終開發人員可能選擇了擴展方法庫,我建議將所有擴展放入他們自己的命名空間,甚至是他們自己的項目文件,以便人們可以選擇添加引用或using語句,或者只是在需要的地方,如下所示:

Core.Extensions.Base64Encode(str);

My Utils課程是我在世界上最好的朋友,它是在擴展方法出現之前,它們只是幫助加強了我們的關系。 我將遵循的最大規則是讓人們選擇他們正在使用的擴展框架。

自20世紀90年代初以來,Objective-C語言已經有了“類別”; 這些與.NET擴展方法基本相同。 在尋找最佳實踐時,您可能希望了解Objective-C(Cocoa和NeXT)開發人員已經提出了哪些經驗法則。

Brent Simmons (適用於Mac OS X和iPhone的NetNewsWire RSS閱讀器的作者)今天剛剛發布了關於他使用類別的新風格規則,並且在該帖子的Cocoa社區中進行了一些討論

我認為這取決於Extension方法的用途。

  • 與項目的特定業務需求相關的擴展方法(無論它們是否連接到基本數據類型或自定義對象)不應包含在將分布在多個項目中的庫中。
  • 與基本數據類型(int,string等)或具有更廣泛應用程序的泛型相關的擴展方法可以跨項目打包和分發。

注意不要全局包含幾乎沒有應用的擴展方法,因為它們只會阻塞智能感知並導致混淆和/或誤用。

當我第一次發現擴展時,我真的過度使用並濫用它們。

在很大程度上,由於多種原因,我已經開始放棄使用任何擴展方法。

我停止使用它們的一些原因在上面的Scott的博客鏈接中注明,例如“在擴展您不擁有的類型之前請三思而后行”。 如果您無法控制要擴展的類型的源,那么如果源類型有一些添加/更改(例如將項目移動到較新的.NET版本),將來可能會遇到問題/沖突。 如果較新的.NET版本包含與您的擴展名相同的類型的方法,則有人會遭到破壞。

我停止使用擴展方法的主要原因是你無法通過閱讀方法源代碼所在的代碼以及“擁有”它來快速判斷。

當只是閱讀代碼時,您無法分辨該方法是擴展還是只是該類型的標准.NET API方法。

intellisense菜單真的很快就會變得非常混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM