Выражения в C# и F#

Этот раздел применим к:

Выпуск

Visual Basic

C#

F#

C++

Web Developer

Express

Тема не применяется Тема применяется Тема применяется Тема не применяется Тема применяется

Pro, Premium и Ultimate

Тема не применяется Тема применяется Тема применяется Тема не применяется Тема применяется

Вычислитель выражений управляемого кода может обрабатывать большинство выражений на C#.

Однако управляемый вычислитель выражений не распознает выражения F#. При отладке F# необходимо перевести выражения в синтаксис C# перед вводом этих выражений в окне отладчика или диалоговом окне. Выполняя перевод выражений F# в синтаксис C#, помните, что в C# в качестве оператора равенства используется ==, а в F# – одинарный знак =.

В следующих разделах содержатся сведения о типах выражений и рассматриваются некоторые типы, которые поддерживаются или не поддерживаемые вычислителем:

  • Приведение типов

  • Динамические объекты

  • Идентификаторы и типы

  • Вычисление метода

  • Операторы

  • Перегруженные операторы

  • Вычисление свойств

  • Строки

  • Операторы "typeof" и "sizeof"

  • WebMethods

  • Вычислитель выражений игнорирует квалификаторы доступа public, protected, internal и private . Например, можно вызвать метод private из окна Контрольные значения. Поскольку вычислитель выражений игнорирует квалификаторы доступа, имеется вероятность непредвиденного вызова загрузки.

Вычислитель выражений выполняет все вычисления в небезопасном неявном контексте, независимо от того, является ли выполняемый код безопасным или нет.

Вычислитель выражений также игнорирует проверенные блоки и параметр компилятора /checked. Все выражения вычисляются в неппроверяемом контексте.

Можно настроить отображение пользовательских типов с помощью атрибутов. Дополнительные сведения см. в разделе Отображение пользовательских типов данных.

Приведение типов

В отладчике поддерживаются простые выражения приведения типов:

(A)x

Приведение типов с использованием указателей в отладчике не поддерживается.

Динамические объекты

Вычислитель выражений может оценивать переменные, которые статически типизированы как динамические. Он также может оценивать объекты, которые реализуют интерфейс IDynamicObject. При вычислении объектов, реализующих интерфейс IDynamicObject в окне Наблюдения, добавляется узел динамического представления. Узел динамического представления отображает элементы объектов, но не разрешает изменение значений этих элементов.

Следующие возможности динамических объектов не поддерживаются:

  • Составные операторы "+=", "-=", "%=", "/=" и "*="

  • Многие приведения, включая числовые приведения и приведения аргументов типа

  • Вызовы методов с более чем двумя аргументами

  • Получатели свойств с более чем двумя аргументами

  • Установщики свойств с аргументами

  • Присвоение индексатору

  • Логические операторы && и ||

Идентификаторы и типы

В выражениях отладчика можно использовать любые идентификаторы, отображающиеся в текущей области. Например, если отладчик остановлен в методе Magh, то можно использовать любые идентификаторы, отображающиеся в области Magh, включая константы, имена переменных и имена методов.

Отладчик правильно отображает все переменные простых, перечисляемых и встроенных типов. Для переменных типа класса отладчик правильно отображает значение на основе ближайшего производного типа. Если имеется объект leo типа Lion, производный от типа Cat, то можно вычислить leo.Claws и получить правильное значение для объекта типа Lion.

Можно присвоить новое значение любому выражению левой части, являющемуся L–значением. Это простые типы, классы и типы System.Object.

Вычисление метода

Отладчик поддерживает вычисление методов, в том числе перегруженных. Поэтому при вводе любого из следующих выражений отладчик вызовет нужную версию перегруженного метода:

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

Вычисление метода в отладчике фактически вызывает и выполняет код этого метода. Если у метода есть побочные эффекты, вычисление метода в окне отладчика изменит состояние программы, что может привести к непредсказуемым результатам.

Если установить точку останова в перегруженном методе, расположение точки останова будет зависеть от способа задания функции. Если задать полную подпись (имя метода и полный список аргументов), отладчик установит только одну точку останова в указанной версии перегруженной функции. Если же задано только имя метода, поведение отладчика будет зависеть от параметров Visual Studio. Если флажок Использовать технологию IntelliSense для проверки имени функции не установлен, отладчик установит по одной точке останова в каждой версии перегруженного метода. В противном случае откроется диалоговое окно Выбор точек останова, в котором можно указать, в какие именно из перегруженных методов установить точку останова. Дополнительные сведения см. в разделе Практическое руководство. Установка точки останова в функции.

Создание новых анонимных методов не поддерживается отладчиком в данной версии Visual Studio.

Операторы

Отладчик правильно вычисляет большинство встроенных операторов, в том числе перечисленные ниже.

  • Реляционные операторы и операторы равенства: (expr1 > expr2, expr1 < expr2, expr1 <= expr2, expr1 => expr2, expr1 == expr2, expr1 != expr2).

  • Логические операторы: (expr1 && expr2, expr1 || expr2, expr1 ? expr2 : expr3).

  • Арифметические операторы: (выражение1 + выражение2,выражение1 - выражение2, выражение1 * выражение2, выражение1 / выражение2, выражение1 % выражение2 ).

  • Логические операторы: (выражение1 & выражение2, выражение1 ^ выражение2, выражение1 | выражение2 ).

  • Операторы сдвига: (expr1 >> expr2, expr1 << expr2 ).

  • Операторы присваивания: ( 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).

Перегруженные операторы

В отладчике можно использовать большинство перегруженных операторов.

В частности, допустимы перегруженные инфиксные операторы +, -, /, % и &.

  • expr1 + expr2

  • expr1 - expr2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

Перегруженные инфиксные операторы =, &&, & и || не работают.

  • expr1 = expr2

  • expr1 && expr2

  • expr1 & expr2

  • expr1 || expr2

Перегруженные инфиксные операторы <<И>> не работают, если оба операнда являются переменными класса:

  • object1 <<object2

  • объект_1 >> объект_2

Перегруженные префиксные операторы +, -, ++, --, ! и ~ поддерживаются.

  • + expr1

  • - expr1

  • ++ expr1

  • -- expr1

  • ! expr1

  • ~ expr1

Перегруженные постфиксные операторы ++ и – поддерживаются.

  • expr1 ++

  • expr1 --

Перегруженные индексаторы поддерживаются:

  • 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

Вызов веб–методов в окнах отладчика не поддерживается.

См. также

Другие ресурсы

Выражения в отладчике

Справочник по C#