Как вы используете Immediate Window в Visual Studio?


121

Immediate Window - чрезвычайно полезный инструмент для отладки приложений. Его можно использовать для выполнения операторов кода, которые действительны в контексте точки останова, и проверки значений. Я также использую его для набора фрагментов кода для изучения языковых функций.

Как вы используете немедленное окно?


Если вы имеете в виду выполнение отдельных команд Visual Studio, посмотрите примеры в [Immediate Window] [1]. Это показывает, как оценивать выражения, выполнять операторы, печатать значения переменных и т. Д. Через непосредственное окно. [1]: msdn.microsoft.com/en-us/library/f177hahy(VS.80).aspx
TStamper

2
Есть некоторые специальные команды, список которых сложно найти. msdn.microsoft.com/en-us/library/ms171362(v=vs.100).aspx Некоторые возможности windbg доступны. Используется для того, чтобы по адресу находить ближайший символ. (ln) Я думаю, что это тупо отключили. Я бы хотел иметь команду windbg dt для отображения типов в структурах и т. Д. По крайней мере, вы можете ввести объектную переменную, чтобы получить все члены в списке с их значениями. (вместо того, чтобы пытаться играть в игру с открытием узла и закрытием узла.)
kalbr

для Visual Studio 2017 ссылка на соответствующую документацию: docs.microsoft.com/en-us/visualstudio/ide/reference/…
Pac0

Ответы:


130

Одна хорошая особенность Immediate Window в Visual Studio является возможностью оценить возвращаемое значение методы , особенно если она вызвана вашим код клиента , но это не часть присваивания переменного. В режиме отладки, как уже упоминалось, вы можете взаимодействовать с переменными и выполнять выражения в памяти, что играет важную роль в этом.

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

private static int GetSum(int a, int b)
{
    return a + b;
}

Затем в окне Immediate Window вы можете ввести следующее:

? GetSum(2, 4)
6

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

Например, допустим, так выглядит ваш класс:

private class Foo
{
    public string GetMessage()
    {
        return "hello";
    }
}

Если объект уже существует в памяти и находится в области видимости, вы можете вызвать его в Immediate Window, если он был создан до вашей текущей точки останова (или, по крайней мере, до того места, где код приостановлен в режиме отладки):

? foo.GetMessage(); // object ‘foo’ already exists
"hello"

Кроме того, если вы хотите взаимодействовать и протестировать метод напрямую, не полагаясь на существующий экземпляр в памяти, вы можете создать свой собственный экземпляр в окне Immediate Window:

? Foo foo = new Foo(); // new instance of ‘Foo’
{temp.Program.Foo}
? foo.GetMessage()
"hello"

Вы можете пойти дальше и временно присвоить результаты метода переменным, если хотите проводить дальнейшие оценки, вычисления и т. Д .:

? string msg = foo.GetMessage();
"hello"
? msg + " there!"
"hello there!"

Более того, если вы даже не хотите объявлять имя переменной для нового объекта, а просто хотите запустить один из его методов / функций, сделайте следующее:

? new Foo().GetMessage()
"hello" 

Очень распространенный способ увидеть значение метода - выбрать имя метода класса и выполнить «Добавить наблюдение», чтобы вы могли видеть его текущее значение в окне отслеживания. Однако, еще раз, объект должен быть создан и находиться в области видимости для отображения допустимого значения. Это намного менее эффективно и более ограничительно, чем использование Immediate Window.

Наряду с проверкой методов вы можете выполнять простые математические уравнения:

? 5 * 6
30

или сравните значения:

? 5==6
false
? 6==6
true

Знак вопроса ('?') Не нужен, если вы находитесь непосредственно в окне Immediate Window, но он включен здесь для ясности (чтобы различать введенные выражения и результаты). Однако, если вы находитесь в Command Window и вам нужно чтобы быстро выполнить какие-то действия в окне Immediate Window, тогда перед вашими операторами ставьте '?' и вперед.

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

К сожалению, еще одним недостатком Immediate Window является то, что оно не поддерживает циклы.


1
Как найти непосредственное окно?
jpaugh 02

1
Ctrl + Alt + Iили Отладка -> Windows -> Немедленно
Ray

11

Используйте непосредственное окно для выполнения команд

Непосредственное окно также можно использовать для выполнения команд. Просто введите a, >а затем команду.

введите описание изображения здесь

Например >shell cmd, запустит командную оболочку (это может быть полезно, например, для проверки того, какие переменные среды были переданы в Visual Studio). >clsочистит экран.

Вот список команд, которые так часто используются, что у них есть собственные псевдонимы: https://msdn.microsoft.com/en-us/library/c3a0kd3x.aspx


2
хороший совет. Фактически, это прекрасно сочетается с другим трюком, который я использую: >open Filenameоткрывает выбранный файл в решении и даже имеет завершение имени файла.
Филлип Нган

6

Окно Immediate используется для отладки и оценки выражений, выполнения операторов, печати значений переменных и т. Д. Он позволяет вам вводить выражения, которые будут оцениваться или выполняться языком разработки во время отладки.

Чтобы отобразить Immediate Window, выберите Debug> Windows> Immediate или нажмите Ctrl-Alt-I.

введите описание изображения здесь

Вот пример с Immediate Window:

int Sum(int x, int y) { return (x + y);}
void main(){
int a, b, c;
a = 5;
b = 7;
c = Sum(a, b);
char temp = getchar();}

добавить точку останова

введите описание изображения здесь

вызывать команды

введите описание изображения здесь

https://msdn.microsoft.com/en-us/library/f177hahy.aspx

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.