C#的擴展方法功能使我們可以在沒有源代碼的情況下對一個類的功能進行擴展,雖然有一些限制(比如,只能是實例方法,只能訪問被擴展類的公有成員等)但不失為一個增強代碼靈活度的好機制。 使用擴展方法所需要注意的關鍵中最重要的一條就是“污染性”:一旦對一個類進行了擴展,那麼所有從此類派生的類都會同時擁有該擴展,而且符號相同的情況下,擴展方法會覆蓋掉類中原本的方法。舉個例子,加入擴展了Object類的ToString()方法,那麼C#中幾乎所有類的ToString()方法都會被替換成擴展的版本。 “污染性”只需要多加留意並善加利用便可以產生奇妙的效果。例如: 一個游戲中消息系統的范例:
public abstract class Message { } public static class Message_Extension { public static T Broadcast<T>(this T msg) where T : Message { // deliver the message to all } }
上面的擴展便利用了“污染”,只需要一個定義,所有從Message派生的子消息類型就都具備了Broadcast方法,而且該方法還能夠保持消息子類自身的類型信息(這對於其他泛型應用有很大的意義),這是傳統的利用類繼承所無法達到的效果。