[英]Do we need a keyword partial for all instantiation of partial classes?
[英]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.