這與其說是如何做某事,不如說是一個術語問題。
我發現了一種財產可以處于的第三種狀態。第一種是有效的財產。例如,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 之后的所有呼叫都像您期望的那樣作業,并且該方法會打開和關閉鍵盤。
在看似只是部分實體化之前,我還沒有遇到過一個物件。這種情況的正確技術術語是什么?我用過“實體化”這個詞,對嗎?
uj5u.com熱心網友回復:
根據檔案,當沒有與實體關聯的作業系統行程時,該HasExited屬性會拋出一個。InvalidOperationExceptionProcess
您的屬性已初始化為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");
}
}
}
uj5u.com熱心網友回復:
不可能根據語言的作業情況對物件進行半初始化。如果物件未處于正確狀態,這是由于類/屬性等的作業,以及如何撰寫代碼來初始化物件或在訪問屬性時不拋出例外。
如果物件并不總是按照您的預期執行,那么您必須檢查例外,進行一些防御性編碼并在您自己的代碼中處理各種情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317063.html
標籤:C#
上一篇:在c#應用程式中,如何在SQL中連接子任務表的外鍵?
下一篇:c#洗掉自定義串列的重復項
