繁体   English   中英

部分实例化

[英]Partial Instantiation

这与其说是如何做某事,不如说是一个术语问题。

我发现了一种财产可以处于的第三种状态。第一种是有效的财产。 例如,bool 是 true 或 false。 第二个是空的。 第三个我不知道叫它什么。 它是已实例化的对象的属性。 这个属性看起来好像还没有被实例化。 不确定这是陈述它的正确方式。

示例:使用 System.Diagnostics.Process 打开虚拟键盘 OSK。 我需要一个例程来打开和关闭键盘。 这很好用。

 using System.Diagnostics; namespace Bsc { public static class OnScreenKeyboard { private static Process virtualKeyboard = new Process(); public static void ToggleHideShow() { try { if (virtualKeyboard.HasExited) virtualKeyboard = Process.Start("osk.exe"); else virtualKeyboard.Kill(); } catch { virtualKeyboard = Process.Start("osk.exe"); } } } }

在监视窗口中查看对象 virtualKeyboard 我可以看到 virtualKeyboard 是如何实例化的,但不是完全实例化。 在第一遍 virtualKeyboard.HasExited 抛出异常。 看着监视窗口,好像也没有了。 这条线前面有一个漂亮的鲜红点,里面有一个 X。

姓名 价值 类型
已退出 “virtualKeyboard.HasExited”引发了“System.InvalidOperationException”类型的异常 bool {System.InvalidOperationException}

仍然在第一次通过时,try/catch 跳转到 Process.Start。 执行后,该行看起来像您期望的实例化属性。

姓名 价值 类型
已退出 错误的 布尔值

第一个 HasExited 之后的所有调用都像您期望的那样工作,并且该方法会打开和关闭键盘。

在看似只是部分实例化之前,我还没有遇到过一个对象。 这种情况的正确技术术语是什么? 我用过“实例化”这个词,对吗?

根据文档,当没有与Process实例关联的 OS 进程时, HasExited属性会抛出InvalidOperationException

您的属性已初始化为尚未启动的Process类的新实例。 因此,没有与该实例关联的操作系统进程,并且HasExited属性将引发异常。

删除字段初始值设定项,并在您的方法中测试是否为null

public static class OnScreenKeyboard
{
    private static Process virtualKeyboard;
    public static void ToggleHideShow()
    {
        try
        {
            if (virtualKeyboard == null || virtualKeyboard.HasExited)
                virtualKeyboard = Process.Start("osk.exe");
            else
                virtualKeyboard.Kill();
        }
        catch
        {
            virtualKeyboard = Process.Start("osk.exe");
        }
    }
}

不可能根据语言的工作情况对对象进行半初始化。 如果对象未处于正确状态,这是由于类/属性等的工作,以及如何编写代码来初始化对象或在访问属性时不抛出异常。

如果对象并不总是按照您的预期执行,那么您必须检查异常,进行一些防御性编码并在您自己的代码中处理各种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM