作者介紹:Andrew Troelsen是微軟的C# MVP,同時是Intertech Training技術培訓部的副總裁及合作者。這是我在Duncan Mackenzie的部落格上看到的,感覺很有意思,所以翻譯了幾篇。原文可以查看:http://blogs.msdn.com/csharpfaq/category/7580.aspx
1、通過Windows Form處理Win32訊息
在非託管世界裡,擷取儲存在訊息佇列的Win32訊息時很常見的。如果你希望在託管的Windows Form應用程式中處理Win32訊息,那麼就顯得有些鳳毛麟角了。首先,你應該建立一個協助類實現IMessageFilter介面。該介面提供一個單獨的方法PreFilterMessage()方法,獲得其內部的訊息ID,也就是原始的WPARAM和LPARAM資料。一個簡單例子:
public class MyMessageFilter : IMessageFilter { public bool PreFilterMessage(ref Message m) { // Intercept the left mouse button down message. if (m.Msg == 513) { MessageBox.Show("WM_LBUTTONDOWN is: " + m.Msg); return true; } return false; }}
此時,你必須使用Application類型註冊你的協助類:
public class mainForm : System.Windows.Forms.Form{ private MyMessageFilter msgFliter = new MyMessageFilter(); public mainForm() { // Register message filter. Application.AddMessageFilter(msgFliter); }…}
此時,在訊息擷取Event Handler之前,你自訂的Filter會自動生效。要移去該Filter,可以使用Application的靜態方法Application.RemoveMessageFilter() 。
2、留意References/‘Using’/Manifest之間的關係
如果.Net平台支援類型的二度重用的話,使用Visual Studio.Net的“Add Reference”對話方塊將引用添加到外部程式集就很常見了。很多程式員(尤其是C/C++語言家族的程式員)會非常“害怕”添加不必要的外部參考,因為這樣會造成“代碼膨脹”。實則大謬不然。當你添加引用程式集或使用“using”關鍵字時,csc.exe會忽略你代碼中並沒有真正使用的所有程式集。因此,當你在如下代碼中添加System.Data.dll和System.Windows.Forms.dll 引用:
using System;using System.Data; // Ignored. using System.Windows.Forms; // Ignored. public class MyClass{ public static void Main() { Console.WriteLine("Hi there."); }}
編譯器只會引用mscorlib.dll。
就象你認識到的那樣,當你通過ildasm.exe開啟.NET程式集時,雙擊MANIFEST表徵圖,會快顯視窗顯示擷取的IL資訊。在最上方,你可以看到當前編譯的程式集中實際用到的外部程式集資訊列表:
.assembly extern mscorlib{ … }
[註:Assembly.GetReferencedAssemblies()方法獲得的引用程式集就不包括未被使用的程式集資訊。]
至少,你不需要浪費時間去移除那些應用程式中沒用的using語句和程式集引用了。C#編譯器已經自動為你做好這些了。
3、編輯原始碼時啟用“全螢幕模式”
是的,我得承認這是個“蹩腳”的建議,它似乎看起來並無價值。然而這卻是我最喜歡的Visual Studio.NET中的一個特色(如之前的Visual Studio版本),不過很多人卻忽略了。你可以在“View”菜單下找到“Full Screen”功能表項目。啟用該選項後,當前菜單只顯示當前啟用的文檔。這對那些喜歡介面清爽的人們來說很有協助,因為在IDE中有太多的視窗布局,這使得你的代碼視窗“局促不安”。要退出全螢幕模式,點擊代碼視窗上的“Full Screen”按鈕即可。
4、將自訂程式集添加到“Add Reference”對話方塊中
你已經知道,Visual Studio.NET的“Add Reference”對話方塊並不會顯示機器內的所有程式集,因為它並沒有直接映射到全域組件快取(GAC),自然也不會顯示自訂程式集。作為該限制的彌補,你可以通過“Browse”按鈕查看這些.Dll程式集。
然而,如果你希望Visual Studio.NET的“Add Reference”對話方塊顯示你的自訂程式集,你必須將這些組件檔複製到PublicAssemblies檔案夾中,該檔案夾位於C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE中。一旦你這樣做了,看看吧,你所自訂的.Dll程式集都會自動顯示出來了。
5、使用“using”避免類型名衝突
你已經知道在一個*.cs檔案中,可以使用using關鍵字為編譯器指向一個完整的類型名。然而,你可能不知道使用using關鍵字還可以建立別名(有助於避免命名衝突)。假定你有兩個命名空間定義:
namespace My2DShapes{ public class Hexagon{} }namespace My3DShapes{ public class Hexagon{} }
現在假定你要在下面的應用程式中建立一個3D Hexagon執行個體:
using My2DShapes;using My3DShapes;public class MyApp{ public static void Main() { // Error! Which Hexagon? Hexagon h = new Hexagon(); }}
通過建立別名很容易避免如上出現的命名衝突:
using My2DShapes;using The3DHex = My3DShapes.Hexagon;public class MyApp{ public static void Main() { // This really creates a new My3DShapes.Hexagon. The3DHex h = new The3DHex(); }}
其他幾個tip都很簡單了,例如通過tab鍵,可以直接獲得要實現介面的stub code,還有獲得委託的簽名。這些小技巧,雖然不能為你設計程式帶來多大的用處,但至少可以讓你省不少事。多看看這些,也還是有收穫的啊。