2

好吧,它并不是真正的单例,但我不知道是否有这种稀有事物的模式。

例如,框架中没有办法获得IWin32Window代表控制台应用程序的控制台。

public struct ConsoleWindow : IWin32Window
{
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetConsoleWindow();

    IntPtr IWin32Window.Handle
    {
        get { return GetConsoleWindow(); }
    }
}

然后你像这样使用它。

MessageBox.Show(default(ConsoleWindow), "Hello, World!");

我是不是为了自己的利益太聪明了?这是“.net方式”吗?

我考虑使用静态只读字段(称为什么?),或者只是new ConsoleWindow()但似乎都不正确。

(在这种情况下,性能显然不是问题,因为 Handle 只被访问一次。)

4

1 回答 1

4

您可以使用具有私有构造函数和单个实例属性的类。

public class ConsoleWindow : IWin32Window
{
    [DllImport("kernel32.dll")]
    internal static extern IntPtr GetConsoleWindow();

    IntPtr IWin32Window.Handle
    {
       get { return GetConsoleWindow(); }
    }

    private ConsoleWindow(){}

    public static ConsoleWindow Instance
    { 
        get 
        { 
            if (_instance == null) _instance = new ConsoleWindow();
            return _instance;
        }
    }
    private static ConsoleWindow _instance = null;
}

MessageBox.Show(ConsoleWindow.Instance, "Hello, World!");

我相信这是不可能创建静态类时使用的标准单例模式。

于 2012-09-14T08:49:58.153 回答