Share via


C# 和 F# 中的表达式

本主题适用于:

版本

Visual Basic

C#

F#

C++

Web Developer

学习版

主题不适用 主题适用 主题适用 主题不适用 主题适用

专业版、高级专业版和旗舰版

主题不适用 主题适用 主题适用 主题不适用 主题适用

该托管表达式计算器接受大多数用 C# 编写的表达式。

但是,托管的表达式计算器不识别 F# 表达式。 如果要调试 F#,则需要在将表达式输入调试器窗口或对话框中之前将该表达式转换为 C# 语法。 如果将表达式从 F# 转换为 C#,要确保记住 C# 使用 == 运算符来测试是否相等,而 F# 则使用单个 =。

下列各节提供特定信息并讨论某些不受支持或部分支持的表达式类型:

  • 强制转换

  • 动态对象

  • 标识符和类型

  • 方法计算

  • 运算符

  • 重载运算符

  • 属性计算

  • 字符串

  • typeof 和 sizeof 运算符

  • WebMethods

  • 表达式计算器忽略 public、protected、internal 和 private 访问修饰符。 例如,您可以从**“监视”**窗口调用 private 方法。 由于表达式计算器忽略访问修饰符,因此可以调用预期外的加载。

表达式计算器在隐式的不安全的上下文中执行所有计算,无论所执行的代码是否安全。

表达式计算器还忽略已经检查的块和 /checked 编译器选项。 所有表达式都在未检查的上下文中计算。

您可以使用特性自定义那些自定义数据类型的显示。 有关更多信息,请参见显示自定义数据类型

强制转换

简单强制转换表达式在调试器中有效:

(A)x

涉及指针的强制转换在调试器中无效。

动态对象

表达式计算器可以计算作为动态而静态键入的变量。 还可以评估实现 IDynamicObject 接口的对象。 当在**“监视”**窗口中计算实现 IDynamicObject 接口的对象时,会添加动态视图节点。 动态视图节点显示对象成员,但不允许编辑成员的值。

不支持动态对象的下列功能:

  • 复合运算符 + =、-=、%=、/= 和 *=

  • 很多强制转换包括数值强制转换和类型参数强制转换

  • 带两个以上参数的方法调用

  • 带两个以上参数的属性 getter

  • 带参数的属性 setter

  • 分配给索引器

  • 布尔值运算符 && 和 ||

标识符和类型

调试器表达式可以使用在当前范围内可见的任何标识符。 例如,如果调试器在 Magh 方法中停止,您可以使用在 Magh 中可见的任何标识符,包括常数、变量名和方法名。

调试器可以正确地显示任何 primitive、enum 或 intrinsic 类型的变量。 对于类类型的变量,调试器基于派生程度最大的类型正确显示值。 如果具有从类型 Cat 派生的 Lion 类型的对象 leo,则可为类型 Lion 的对象计算 leo.Claws 并获得正确的值。

您可以向任何为左值的左表达式赋新值。 这包括基元、类和 System.Object 类型。

方法计算

调试器支持方法的计算,包括重载方法的计算。 因此,您可以输入下列任一表达式,调试器将调用重载方法的正确版本:

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

在调试器中计算方法实际上是调用并执行该方法的代码。 如果方法有副作用,在调试器窗口中计算该方法将更改程序的状态,这可能产生意外的结果。

在对重载方法设置断点时,断点的位置取决于指定方法的方式。 如果指定完整签名(方法名和完整参数列表),调试器将对指定的重载设置一个断点。 如果仅指定方法名,调试器的行为将由 Visual Studio 选项设置决定。 如果未选中**“使用 IntelliSense 验证函数名”复选框,调试器将对该方法名的每个重载设置一个断点。 否则,将打开“选择断点”**对话框,允许您指定将断点放在哪些重载上。 有关更多信息,请参见 如何:设置函数断点

在此版本的 Visual Studio 中,不支持在调试器中创建新的匿名方法。

运算符

调试器正确地计算大多数内置运算符,包括:

  • 关系运算符和相等运算符:(表达式1 > 表达式2、表达式1 < 表达式2、表达式1 <= 表达式2、表达式1 => 表达式2、表达式1 == 表达式2、表达式1 != 表达式2)。

  • 布尔运算符:(表达式1 && 表达式2、表达式1 || 表达式2、表达式1 ? 表达式2 : 表达式3)。

  • 算术运算符: (表达式1 + 表达式2,表达式1 - 表达式2, 表达式1 * 表达式2, 表达式1 / 表达式2, 表达式1 % 表达式2)。

  • 逻辑运算符:(expr1 & expr2、expr1 ^ expr2、expr1 | 表达式2)。

  • 移位运算符:(表达式1 >> 表达式2、表达式1 << 表达式2)。

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

  • 一元运算符:(+表达式1、- 表达式1、表达式1++、++expr1、表达式1--, --表达式1)。

重载运算符

大多数重载运算符在调试器中有效。

重载中缀运算符 +、-、/、% 和 & 有效:

  • expr1 + expr2

  • 表达式1 - 表达式2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

重载中缀运算符 =、&&、& 和 || 无效:

  • expr1 = expr2

  • 表达式1 && 表达式2

  • expr1 & expr2

  • expr1 || expr2

如果两个操作数都是类变量,重载中缀运算符 << 和 >> 无效:

  • 对象1 <<对象2

  • 对象1 >> 对象2

重载前缀运算符 +、-、++、--、! 和 ~ 有效:

  • + 表达式1

  • - 表达式1

  • ++ 表达式1

  • -- 表达式1

  • ! 表达式1

  • ~ 表达式1

重载后缀运算符 ++ 和 -- 有效:

  • 表达式1 ++

  • 表达式1 --

重载索引器有效:

  • expr1 [ expr2 ]

属性计算

调试器可以在任何变量窗口中计算属性。 不过,在调试器中计算属性可能会有副作用,从而产生意外的、不想要的结果。 若要防止意外计算所产生的副作用,可以在**“选项”**对话框中关闭属性计算。

字符串

调试器不仅可识别与数组一起使用的索引运算符,还可识别与字符串一起使用的索引运算符。 例如,您可以输入:

"hello world"[0]

**“监视”**窗口将显示正确的值:

'h'

在 C# 中,与本机 C/C++ 不同的是可以在调试器中编辑字符串的值。 另外,可以对字符串使用 Length 运算符:

mystring.Length 

- 或 -

"hello world".Length

在 C# 中,可以连接字符串:

"hello" + "world"

typeof 和 sizeof 运算符

调试器支持 typeof 和 sizeof 运算符,方法是将其转换为等效的 .NET Framework 函数。

typeof ( 表达式 )

被转换为:

System.Type.GetType( 表达式 )

调试器随后计算该已转换表达式。

调试器支持 sizeof 运算符。

WebMethods

不能从调试器窗口调用 WebMethods。

请参见

其他资源

调试器中的表达式

C# 参考