Какой из последних трех вариантов более корректен? (подозреваю последний)
и почему при отсутствии return не происходит завершение программы. (Вариант 2)
12.11.04 12:56: Перенесено модератором из '.NET' — AndrewVK
можть и я вам когда-нибудь помогу
Завершение приложения.
От:
Аноним
Дата:
10.11.04 16:57
Оценка:
Одного не понимаю. Еще когда я программил на c++, я думал, что после return заканчивает выполнение функции. Какой смысл после return чего-то вызывать:
...
return;
MessageBox.Show("test"); //данная строка не будет вызываться
...
Поставь ReSharper он тебе тонко намекнет, что после return код не выполняется никогда. Соответсвенно наличие\отсутствие там мессаджебокса ни на что не влияет.
Здравствуйте, GarryIV, Вы писали:
GIV>Hello, ynblpb!
y>> Забавная ситуация имеется:
GIV>Поставь ReSharper он тебе тонко намекнет, что после return код не выполняется никогда. Соответсвенно наличие\отсутствие там мессаджебокса ни на что не влияет.
GIV>WBR, Igor Evgrafov.
Либо я не корректно поставил вопрос либо пост не внимательно был прочитан.
Я прекрасно знаю что после return не выполняется код.
Непонятно почему если в обработчике есть одна инструкция return приложение
не завершается. И непонятно то почему при непосредственном вызове Application.Exit()
с стоящими после этого вызова инструкциями (в частности MessageBox.Show())
приложение тоже не завершается.
Хотя
Application.Exit Method
This method stops all running message loops on all threads and closes all windows of the application. This method does not force the application to exit. The Exit method is typically called from within a message loop, and forces Run to return. To exit a message loop for the current thread only, call ExitThread.
CAUTION The Form.Closed and Form.Closing events are not raised when the Application.Exit method is called to exit your application. If you have validation code in either of these events that must be executed, you should call the Form.Close method for each open form individually before calling the Exit method.
Иными словами непонятен механизм ни Application.Exit() ни Application.ExitThread()
т.к.
ЗЫ: MessageBox.Show("bla") в приведенных мной примерах смысловой нагрузки не несет. Нужно лишь
в качестве подопытной инструкции, которая нужна для эксперемента.
Здравствуйте, ynblpb, Вы писали:
Y>Здравствуйте, GarryIV, Вы писали:
Y>Непонятно почему если в обработчике есть одна инструкция return приложение Y>не завершается.
Точнее это то понятно. Т.к. мы вроде как не покидаем MessageLoop.
Hello, ynblpb!
y>>> Забавная ситуация имеется:
GIV>> Поставь ReSharper он тебе тонко намекнет, что после return код не GIV>> выполняется никогда. Соответсвенно наличие\отсутствие там GIV>> мессаджебокса ни на что не влияет.
y> Либо я не корректно поставил вопрос либо пост не внимательно был y> прочитан.
Еще раз перечитал вопрос... Склоняюсь к первому варианту
y> Я прекрасно знаю что после return не выполняется код.
И какой смысл тогда в писать Messagebox.Show() после него?
y> Непонятно почему если в обработчике есть одна инструкция return y> приложение не завершается.
??? В твоих вариантах 3-5 есть return и по твоим же словам приложение завершается.
y> И непонятно то почему при непосредственном вызове Application.Exit() с y> стоящими после этого вызова инструкциями (в частности MessageBox.Show()) y> с стоящими после этого вызова инструкциями (в частности y> MessageBox.Show()) приложение тоже не завершается.
Хочу заметить что не любыми инструкциями. А именно Messagebox.Show(). ИМХО причины в том, что он производит манипуляции с message loop приложения. И это что-то не дает выйти из него.
y> ЗЫ: MessageBox.Show("bla") в приведенных мной примерах смысловой y> нагрузки не несет. Нужно лишь в качестве подопытной инструкции, которая y> нужна для эксперемента.
Как раз эта строчка является причиной происходящего... Количество return'ов ни на что не влияет.
А вообще, если тебе интересно, берешь Reflector и пытаешься выяснить что же такое делаем Messagebox.Show() что не дает процессу завершиться после вызова Exit().
Здравствуйте, GarryIV, Вы писали:
GIV>А вообще, если тебе интересно, берешь Reflector и пытаешься выяснить что же такое делаем Messagebox.Show() что не дает процессу завершиться после вызова Exit().
Насколько я понимаю, Application.Exit(), Application.ExitThread(), this.Close() посылают сообщение окнну, что нужно закрыть, выйти и т.д. Но это сообщение ложится в очередь и не выполнится, по крайней мере, пока не закончится выполнение текущей функции. Действительно, как было сказано, MessageBox.Show() не дает правильно обработать это сообщение (выхода), а return выбрасывает из функции до выполнения MessageBox.Show() и все завершается "как по маслу".