• C# Tips Written By Andrew Troelsen


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

  • 相关阅读:
    POJ2559/HDU1506 Largest Rectangle in a Histogram (cartesian tree)
    POJ2201 Cartesian Tree (cartesian tree)
    一本通1007
    一本通1006
    一本通1005
    一本通1004
    一本通1003
    一本通1002
    一本通1001
    一本通1000
  • 原文地址:https://www.cnblogs.com/wayfarer/p/55991.html
Copyright © 2020-2023  润新知