Поделиться через


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

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

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

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

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

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

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

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

  • Операторы

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

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

  • Строки

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

  • Веб-методы

  • Вычислитель выражений игнорирует модификаторы доступа 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.

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

Операторы

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

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

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

  • Арифметические операторы: (expr1+ expr2,expr1- expr2, expr1* expr2, expr1/ expr2, expr1% expr2 ).

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

  • Операторы сдвига: (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

  • object1 >> object2

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

  • + 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 ( expression )

преобразуется в:

System.Type.GetType( expression )

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

Отладчик поддерживает оператор sizeof.

Веб-методы

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

См. также

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

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

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