Код исчезает при сохранении проекта [дубликат]

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

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

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

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

? GetSum(2, 4)
6

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

Например, предположим, что это выглядит следующим образом:

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

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

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

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

? 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, но он включен здесь для ясности (чтобы различать типизированные выражения по сравнению с результатами). Однако, если вы находятся в окне команд и должны делать некоторые быстрые вещи в окне «Немедленное», а затем перед вашими утверждениями «?» и вы уходите.

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

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

5
задан horgh 23 November 2012 в 09:18
поделиться

3 ответа

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

Это происходит только с обработчиками событий¹. Запишите их без задержки или прокомментируйте их с помощью todo ²

¹ То есть обработчики событий являются методами класса дизайна , и они создаются, перечисляются и удаляются (если они пойманы пустым при сохранении или компиляции) конструктором формы (сюда относятся проектировщик модуля данных и любые другие пользовательские дизайнеры установлен). Обратитесь к делегатам , которые вы, вероятно, знакомы с фоном C #. Любые другие методы подчиняются «ручному» управлению.

² Элементы TODO (Ctrl + Shift + T по умолчанию для привязки клавиш), безусловно, лучше, чем просто пустые комментарии:

procedure TForm1.MagicButton1Click(Sender: TObject);
begin
  { TODO -ctomorrow : I'm going to write the code, I promise! }
end;

Возможный специальный случай

TAction с набором AutoCheck должен (см. комментарий от сэра Руфо ниже для другой возможности во время выполнения) имеет свой OnExecute, назначенного для Enabled. В этом случае неизбежно иметь такие пустые обработчики событий в классе дизайна . Пример:

procedure TMonitor.AutoCheckActionExecute(Sender: TObject);
begin
  // dummy stub
  { DONE -crefactor : merge with other stub(s) }
end;
18
ответ дан Community 22 August 2018 в 04:36
поделиться
  • 1
    +1 Это очень хорошо написанный и полезный ответ. – David Heffernan 23 November 2012 в 11:53
  • 2
    Все еще не хватает ссылки на вводный текст о «классе дизайна». концепция, tho. Знаете ли вы? – OnTheFly 23 November 2012 в 12:11
  • 3
    Нет особого случая с TAction. Просто установите для параметра TAction.DisableIfNoHandler значение false. Но вы должны это делать во время выполнения, потому что это не опубликованное свойство (просто публичное) – Sir Rufo 23 November 2012 в 12:27
  • 4
    @Sir Rufo, yep, и это неопубликованное свойство делает обработчик заглушки более простым. – OnTheFly 23 November 2012 в 12:53
  • 5
    Согласитесь с Дэвидом и вами. Больше не делайте много форм программирования, но ваш подход - это то, что я тоже делал. – Marjan Venema 23 November 2012 в 12:58
13
ответ дан bummi 22 August 2018 в 04:36
поделиться

Есть ли способ предотвратить IDE от удаления функций / процедур с пустым телом при сохранении?

В среде IDE нет возможности отключить это поведение.

7
ответ дан David Heffernan 22 August 2018 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: