作者介绍: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,还有获得委托的签名。这些小技巧,虽然不能为你设计程序带来多大的用处,但至少可以让你省不少事。多看看这些,也还是有收获的啊。