C# 和 F# 中的運算式

Managed 運算式評估工具可接受大部分以 C# 所撰寫的運算式。

不過,Managed 運算式評估工具無法辨識 F# 運算式。 如果您在偵錯 F#,需將運算式轉譯為 C# 語法,才能在偵錯工具視窗或對話方塊中輸入運算式。 將運算式從 F# 轉譯為 C# 時,請記住 C# 會使用 == 運算子來測試相等性,而 F# 則會使用單一 =。

下列章節提供特定的資訊,並討論一些不支援或僅部分支援的運算式類型:

  • Casts

  • Dynamic Objects

  • Identifiers and Types

  • Method Evaluation

  • Operators

  • Overloaded Operators

  • Property Evaluation

  • Strings

  • typeof and sizeof Operators

  • WebMethods

  • 運算式評估工具會忽略存取 public, protected, internal 和 private 存取修飾詞。 例如,您可以從 [監看式] 視窗呼叫 private 方法。 由於運算式評估工具會忽略存取修飾詞,因此可能會叫用 (Invoke) 未預期的載入。

不論執行的程式碼為 safe 或 unsafe,運算式評估工具都會在隱含 unsafe 內容中執行所有評估。

運算式評估工具也會忽略檢查過的區塊和 /checked 編譯器選項。 對於未檢查內容中的所有運算式都會加以評估。

對於自訂資料型別,您可以使用屬性 (Attribute) 來自訂其顯示。 如需詳細資訊,請參閱顯示自訂資料型別

轉換

簡單的轉換運算式可用在偵錯工具中:

(A)x

關於指標的轉換不適用於偵錯工具中。

動態物件

運算式評估工具可以評估以靜態方式設為動態型別的變數。 它也可以評估實作 IDynamicObject 介面的物件。 在 [監看式] 視窗中評估實作 IDynamicObject 介面的物件時,會加入 [動態檢視] 節點。 [動態檢視] 節點會顯示物件成員,但不允許編輯成員的值。

不支援下列動態物件功能:

  • 複合運算子 +=、-=、%=、/= 和 *=

  • 許多轉型,包括數字轉型和型別引數轉型

  • 具兩個以上引數的方法呼叫

  • Getter 屬性具有兩個以上的引數

  • 具有引數的 Setter 屬性

  • 指派給索引子

  • 布林運算子 && 和 ||

識別項和型別

偵錯工具運算式可以使用任何在目前範圍 (Scope) 中可見的識別項。 舉例來說,如果偵錯工具在 Magh 方法內中止,您就可以使用任何在 Magh 中可見的識別項,包括常數、變數名稱和方法名稱。

偵錯工具可以正確地顯示任何基本、列舉或內建 (Intrinsic) 型別的變數。 對於類別型別的變數,偵錯工具會根據衍生最徹底的型別來正確地顯示該值。 如果您有一個型別為 Lion 的物件 leo (衍生自 Cat 型別),您就可以評估 leo.Claws,並取得型別為 Lion 之物件的正確值。

您可以指定新數值給任何屬於左值 (L-value) 的左方運算式。 這些包括基本、類別和 System.Object 型別。

方法評估

偵錯工具支援方法的評估,包括多載方法。 因此,您可以輸入下列任一運算式,偵錯工具將呼叫多載方法的正確版本:

Time.Set();
Time.Set(atime);

在偵錯工具中評估方法實際上會呼叫並執行該方法的程式碼。 如果方法會有副作用 (Side Effect),在偵錯工具視窗中評估該方法將會變更程式的狀態,這可能會產生無法預期的結果。

當您在多載方法上設定一個中斷點時,中斷點的位置會視您如何指定方法而定。 如果指定完整簽章 (方法名稱和完整引數清單),偵錯工具會在指定的多載上設定一個中斷點。 如果只指定了方法名稱,偵錯工具的行為就會取決於 Visual Studio 選項的設定。 如果未核取 [使用 IntelliSense 驗證函式名稱] 核取方塊,偵錯工具將會在該方法名稱的每個多載上都設定一個中斷點。 或者,[選擇中斷點] 對話方塊會開啟,讓您指定要在哪些多載上放置中斷點。 如需詳細資訊,請參閱 HOW TO:設定函式中斷點

這個 Visual Studio 版本中的偵錯工具並不支援建立新的匿名方法。

運算子

偵錯工具會正確地評估大部分的內建運算子,包括:

  • 關係運算子以及等號比較運算子:( expr1> expr2、expr1< expr2、expr1<= expr2、expr1=> expr2、expr1== expr2、expr1!= expr2)。

  • 布林值操作元:(expr1&& expr2、expr1|| expr2、expr1? expr2: expr3)。

  • Arithmetical operators: (expr1+ expr2,expr1- expr2, expr1* expr2, expr1/ expr2, expr1% expr2 ).

  • 邏輯運算子:(expr1& expr2, expr1^ expr2, expr1| expr2 )。

  • 移位運算子:(expr1>> expr2、expr1<< expr2 )。

  • Assignment operators: ( lvalue= expr2,lvalue*= expr2,lvalue/= expr2, lvalue%= expr2, lvalue+= expr2, lvalue-= expr2, lvalue<<= expr2, lvalue>>= expr2, lvalue&= expr2, lvalue^= expr2, lvalue|= expr2).

  • 一元運算子:( +expr1、- expr1、expr1++, ++expr1、expr1--, --expr1)。

多載運算子

大部分的多載運算子 (Overload Operator) 都可用在偵錯工具中。

多載中置運算子 +、-、/、% 和 & 可以使用:

  • expr1 + expr2

  • expr1 - expr2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

多載中置運算子 =、&&、& 和 || 不可使用:

  • expr1 = expr2

  • expr1 && expr2

  • expr1 & expr2

  • expr1 || expr2

如果兩個運算元都是類别變數,則不能使用多載中置運算子 << 和 >>:

  • object1 <<object2

  • object1 >> object2

多載前置運算子 +、-、++、--、! 和 ~ 可使用:

  • + expr1

  • - expr1

  • ++ expr1

  • -- expr1

  • ! expr1

  • ~ expr1

多載後置運算子 ++ 和 -- 可使用:

  • expr1 ++

  • expr1 --

多載索引子 (Indexer) 可以使用:

  • expr1 [ expr2 ]

屬性評估

偵錯工具可評估任何變數視窗中的屬性。 然而,在偵錯工具中評估屬性可能有副作用,產生未預期而且不想要的結果。 若要防止意外評估所產生的副作用,您可以關閉 [選項] 對話方塊中的屬性評估。

字串

偵錯工具會辨識和字串及陣列一起使用的索引運算子。 因此,您可以輸入下例:

"hello world"[0]

[監看式] 視窗將會顯示正確的值:

'h'

在 C# 中 (和原生 (Native) C/C++ 不一樣),您可以在偵錯工具中編輯字串的值。 此外,您也可以在字串上使用 Length 運算子:

mystring.Length 

-或-

"hello world".Length

在 C# 中,您可以串聯字串:

"hello" + "world"

typeof 和 sizeof 運算子

偵錯工具支援 typeof 和 sizeof 運算子,它會將那些運算子轉換成等同的 .NET Framework 函式。

typeof ( expression )

會轉換成:

System.Type.GetType( expression )

然後偵錯工具就會評估這個轉換的運算式。

偵錯工具支援 sizeof 運算子。

WebMethod

您不能從偵錯工具視窗中呼叫 WebMethod。

請參閱

其他資源

偵錯工具中的運算式

C# 參考