Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 81

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 320 >> Следующая

Как и все остальные средства обработки ошибок, исключения не могут быть проигнорированы. Скорее всего, при чтении предыдущих разделов у вас уже возник вопрос: а что будет, если мы сгенерируем исключение, которое не будет перехватываться? Например, предположим, что у нас генерируется исключение CarlsDeadException, а соответствующий ему блок catch в программе отсутствует. Как правило, результатом необработанного исключения ся смущающие конечного пользователя диалоги, подобные представленному на рис. 3.20.
Надеюсь, мне удалось убедить вас в том, что исключения в приложениях следует перехватывать. Осталось разобраться еще с одним важным моментом — а что делать с захваченным исключением? На этот вопрос придется отвечать вам как разработчику приложения. В нашем учебном примере с автомобилем результатом захвата исключения становится вывод на системную консоль определенного нами
186 Глава 3 С# и объектно-ориентированное программирование
сообщения и информации стека. В реальном приложении, к примеру, может происходить освобождение ресурсов и запись информации в файл журнала. Создание исключения и его перехват — это лишь общая схема, а реальное содержание, которым оно будет наполнено, зависит только от нас.
IHIl
An exception ¦bccepbonsXarIsOeadEXteptlon' has occurred in D^CSharpBoo^LabtVChapter 3\E)eceptlons\bin\Debue\Eiceptitris.exe.
Будьте осторожны и не допускайте бесконечной генерации ошибок. Обычно такая ситуация возникает, когда ключевое слово throw помещается в блок catch:
try
[ // Код для ускорен/я автомобиля... }
catchCCarlsDeadException е)
{
// Код для реакции на захваченное исключение
// В этом коде мы генерируем то же самое исключение. Конечно, при необходимости // мы ножен генерировать и другое исключение throw e;
}
Наконец, отметим еще один важный момент. Необходимо принять за правило, что исключения должны генерироваться только тогда, когда возникает действительно непоправимая ситуация. Если у вас есть возможность выйти из положения с помощью обычной логики приложения, лучше постараться обойтись без исключения. В свете всего этого наше исключение СагІ5иеааЕхсерт,іопврядли бы использовалось в реальном приложении. В главе 5 рассмотрен новый вариант метода SpeedUpC), в котором пользовательское исключение используется для более COOT-ветствующих его предназначению задач.
Жизненный цикл объектов 187
Жизненный цикл объектов
В С# общий принцип управления памятью формулируется очень просто: для создания объекта в области «управляемой кучи» (managed heap) используется ключевое слово new. Среда выполнения .NETавтоматически удалит объект тогда, когда он больше не будет нужен. Правило в целом вполне понятно, однако возникает один дополнительный вопрос: а как среда выполнения определяет, что объект больше не нужен? Короткий (то есть неполный) ответ гласит, что среда выполнения удаляет объект из памяти, когда в текущей области видимости больше не остается активных ссылок на этот объект. Например:
// Создаем локальный объект класса Саг public static Int Main(string[] args) {
Il Помещаем объект класса Car в управляемую кучу Саг сЗ = new Саг("Viper". 200, 100):
return 0:
) Il Если сЗ - единственная ссылка на этот объект, то начиная с этого момента // он нонет быть удален
Предположим, что в вашем приложении создано (размещено в оперативной памяти) три объекта класса Саг. Если в управляемой куче достаточно места, мы получим три активные ссылки - по одной на каждый объект в оперативной памяти. Каждая такая активная ссылка на объект в памяти называется также корнем (root). To, что у нас получилось, схематически представлено на рис. 3.21.
Доступные ссылки (корни)
Card = new Саг Саг = new Саг (У. Саг сЗ = new Car
Рис. 3.21, Ссылки указывают на местонахождение объектов в управляемой куче
Если вы занимаетесь только тем, что создаете все новые и новые объекты, в конце концов пространство в управляемой куче закончится. В ситуации, когда свободного места в управляемой куче больше нет, а вы пытаетесь создать новый объект, будет сгенерировано исключение Out Of Memory Except і on. Поэтому, если вы хотите создать код приложения, совершенно исключив возможность возникновения ошибок, создавать объекты можно следующим образом (в реальных приложениях так
обычно не поступают):
С1
с2
сЗ
Неиспользуемое
пространство кучи
Управляемая куча
188 Глава 3 • С# и объектно-ориентированное программирование
// Создаем объекты Саг гакик образом, чтобы отреагировать на возможную нехватку места // е управляемой куче
public static int Main(string[] args) {
Саг yetAnotherCar; try
(
yetAnotherCar = new Car();
}
catch(OutQfMemoryException e) {
Console.WriteLine(e. Message):
"fanaoed heap is FULL! Running
)
return
Вне зависимости от того, насколько осторожно вы будете создавать объекты, как только место в управляемой куче заканчивается, автоматически запускается сборщик мусора (garbage collector, GC). Сборщик мусора оценивает все объекты, размещенные в настоящий момент в управляемой куче, с точки зрения того, есть ли в области видимости приложения активные ссылки на них. Если активных ссылок на какой-либо объект больше нет или объект установлен в hui 1, этот объект помечается для удаления, и в скором времени память, занимаемая подобными
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100