評C#事件處理

來源:互聯網
上載者:User

前幾天學了一點C#,沒當真的。因為要搞《MSDN開發精選》的緣故,完全不懂也說不過去。沒看什麼語言方面的書。也就是把Jefferey Richter的《Applied .NET Framework》(李建忠譯本)找來翻翻。看到event那一部分就煩了,原來C#的delegate和event只是表面光,下面的實現還是非常笨重。一個長長的鏈表,裡面放著閉包指標,類型是夠安全了,付出的空間和時間效率都不小。對我我這種從C語言爬過來的人,就是覺得不爽。

事件處理機制是C++及其後繼者(Java、C#)的最大軟肋之一。本質上是因為C++當年的選擇,把對象之間的普通訊息傳遞用成員函數調用給解決了。成員函數調用快是夠快,但是導致了訊息寄件者與接受者之間的緊耦合。大多數情況下這倒也並不是什麼大不了的事,偏偏在事件處理上,實踐中需要松耦合,於是C++的問題就暴露出來了。君不見,所有用C++寫的GUI Framework都在event這件事情上大做文章。比較笨的如MFC的全域對應表,比較聰明的如Qt的Signal/Slot,一個例外是VCL,Borland實現了closure指標,把caller context跟指標綁到一起發送給callee,Java比較中規中矩,按照最OO的方式實現了事件處理機制,但是可擴充性不好。C#的delegate其實就是VCL中closure指標的新版。總之是八仙過海,各顯其能。但是我覺得,都是在C++已經走歪的老路上徒然努力。只要這個思路還在,事件處理就不可能非常elegant。C#可以讓整件事情在表面上看起來很漂亮,可是骨子裡還是邋遢的。

就個人而言,我還是比較欣賞C的辦法:規定一個協議,我把event資料準備好放在一個地方,然後就不管了,事件的接受者自己去取資料,自己解析,自己決定如何處理。

這樣的接受者,在對象分類中,叫做主動對象——active object。這兩年在embedded system programming中間,大家越來越發現主動對象的種種優勢。我個人覺得主流編程領域也應該考慮一下這個問題。

主動對象的問題可能是類型不安全,但實際上型別安全沒有那麼重要, 沒必要死抱住不放。原來C語言裡:
int (*compare)();
聲明的指標可以指向任何返回整數的函數,不管其參數列表如何。在C++裡面,這個指標只能指向一個返回整數的無參函數了,靈活性大大降低。也難怪open source人士還是偏愛C。雖然安全性和靈活性同等重要,但是真正的駭客可以用自己的技術來保障安全性,卻無法接受靈活性的缺失。

扯遠了。

總之,看得越多,越覺得C真是一種偉大的語言,大概只有Fortran和LISP跟它處於同一層級。

附帶提一句,李建忠翻譯的品質極高,令我輩歎服。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.