Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 397 398 [399] 400 401 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5971
,
|
|
|
|
Цитата DesweR @ Цитата D_KEY @ Так это ты зациклился на синтаксисе. Вышеперечисленные средства не просто синтаксический сахар, это как раз смена "парадигмы" с "явного делания чего-то при выходе" на "захват ресурса и автоматическое его освобождение". И костыль в виде finally можно выпиливать. Да? Да. |
|
Сообщ.
#5972
,
|
|
|
|
DesweR, с вами мы finally уже обсуждали. Про GC в дельфи, плиззз!
|
|
Сообщ.
#5973
,
|
|
|
|
Цитата DesweR @ А для нетривиальных ситуаций разве не нужно расставлять локальные блоки { ... } (а-ля try ... finally)? ![]() Вообще-то try - это обычно часть механизм обработки исключений(в Delphi не так?). И какое отношение к ним имеют обычные локальные блоки - для меня загадка. Цитата А на нетривиальную деинициализацию не нужно ничего биндить (а-ля finally ... end)? ![]() Пример пожалуйста можешь привести? Цитата Если я правильно понял, то идиома Scope Guard из C++ - как раз тот костыль try-finally из Delphi. Эта идиома как раз позволяет не писать костылей. Захватили ресурс - освободили ресурс. И никаких лишних телодвижений. Для "нетривиальных случаев" пишется костыль в виде объекта, который дергает произвольную лямбду, а не освобождает ресурсы. И тут уже пиши что хочешь, как в твоем любимом finally. Добавлено MyNameIsIgor, как видишь, не выдержал Добавлено Цитата MyNameIsIgor @ Про GC в дельфи, плиззз! Да-да. |
|
Сообщ.
#5974
,
|
|
|
|
Цитата D_KEY @ Синтаксический сахар - это один из способов обеспечения удобного использования парадигмы. То, что with в питоне сейчас реализован именно так, не является его семантическим свойством. Выпили finally из python 4, реализуй with иначе, но с сохранением той же семантики, и он перестанет быть синтаксическаим сахаром. Да нет тут никакой парадигмы, слишком большое слово для такой мелочи =) Ладно, сегодня не холиварный день, всех с Наступающим! |
|
Сообщ.
#5975
,
|
|
|
|
Цитата korvin @ Да нет тут никакой парадигмы, слишком большое слово для такой мелочи =) Управление ресурсами без костылей - это не мелочь Особенно хорошо, что до этого дошли и языки с GC, а то раньше там без finally никак было. Цитата Ладно, сегодня не холиварный день Скоро будет не холиварная неделя, потому сегодня с утра еще можно немного побубнить |
|
Сообщ.
#5976
,
|
|
|
|
Цитата D_KEY @ коро будет не холиварная неделя, потому сегодня с утра еще можно немного побубнить Тем более, что и задач то сегодня практически нет... По крайне мере я свои закрыл ещё вчера |
|
Сообщ.
#5977
,
|
|
|
|
Цитата D_KEY @ И какое отношение к ним имеют обычные локальные блоки - для меня загадка. При выходе из такого блока, даже если внутри него возникло исключение, объект, принадлежащий ему, гарантированно уничтожается, где его деструкторе выполняется всё то, что вам необходимо. Такая же ситуация и в Delphi, блок finally ... end выполнится при любых ситуациях на участке try ... finally. Те же уши только в профиль. Цитата D_KEY @ Пример пожалуйста можешь привести? Да что угодно: закрытие хэндлов, удаление врем. файлов, запись в лог. Тот же Shared_Ptr из буста, имнип, позволяет вам забиндить кастомную деинициализацию "объекта" (не писать же вам на каждый случай отдельный класс-обвёртку?). Ну и такая же ситуация и в Delphi, только мы в "конце" задаём способ деинициализации, ну а вы в "начале". Те же уши только в профиль. Цитата D_KEY @ Эта идиома как раз позволяет не писать костылей. Захватили ресурс - освободили ресурс. И никаких лишних телодвижений. Костыль от костылей Цитата MyNameIsIgor @ Про GC в дельфи, плиззз! Чего чего? Добавлено D_KEY Вот тебе псевдокод, приведи аналогичный на C++, чтобы я почувствовал синтаксическую и семантическую разницу. ![]() ![]() begin //код //код //код //создание объекта try //запись лог - начало работы //код //ИСКЛЮЧЕНИЕ! //код finally //запись лог - конец работы //освобождение объекта end; //код //код //код end; |
|
Сообщ.
#5978
,
|
|
|
|
Цитата DesweR @ Цитата D_KEY @ И какое отношение к ним имеют обычные локальные блоки - для меня загадка. При выходе из такого блока, даже если внутри него возникло исключение, объект, принадлежащий ему, гарантированно уничтожается, где его деструкторе выполняется всё то, что вам необходимо. Гарантированное уничтожение объектов не связано с обработкой исключений. Деструктор в любом случае должен вызваться, даже если я в проекте вообще исключения не использую(а такой, представь себе, вполне реально). Цитата Такая же ситуация и в Delphi, блок finally ... end выполнится при любых ситуациях на участке try ... finally. Те же уши только в профиль. Совершенно разная ситуация. Свой дурацкий finally ты будешь писать каждый раз. Тут же управление ресурсом делегируется отдельному объекту, а твой код уже не думает об этом. Цитата D_KEY Вот тебе псевдокод, приведи аналогичный на C++, чтобы я почувствовал синтаксическую и семантическую разницу. ![]() ![]() begin //код //код //код //создание объекта try //запись лог - начало работы //код //ИСКЛЮЧЕНИЕ! //код finally //запись лог - конец работы //освобождение объекта end; //код //код //код end; Такой код не нужен в принципе, вы его вынуждены писать, поскольку у вас нет нормального управления ресурсами Добавлено А конкретный случай логирования - это вообще задача аспектного программирования. |
|
Сообщ.
#5980
,
|
|
|
|
Цитата D_KEY @ Управление ресурсами без костылей - это не мелочь Особенно хорошо, что до этого дошли и языки с GC, а то раньше там без finally никак было. Угу, не прошло и двадцати лет... В такие моменты я сразу вспоминаю, за что люблю Лисп. |
|
Сообщ.
#5981
,
|
|
|
|
Цитата D_KEY @ Цитата ![]() ![]() begin //код //код //код //создание объекта try //запись лог - начало работы //код //ИСКЛЮЧЕНИЕ! //код finally //запись лог - конец работы //освобождение объекта end; //код //код //код end; Такой код не нужен в принципе, вы его вынуждены писать, поскольку у вас нет нормального управления ресурсами ![]() Т.е. тот же код по сути должен выглядеть так: ![]() ![]() // Без GC begin // код // код // код end; ![]() ![]() // С GC begin // код // код // код with {ресурсы} // код // код // код end; // код // код // код end; |
|
Сообщ.
#5982
,
|
|
|
|
На сколько я знаю, не каждый. Те объекты, у которых есть финализаторы, ставятся в очередь на финализацию. Объект можно оттуда убирать, но тогда его финализатор вызван не будет. |
|
Сообщ.
#5983
,
|
|
|
|
IL_Agent, так зачем финализаторы в шарпе? Только чтобы один раз базу было ненапряжно удалять?
|
|
Сообщ.
#5984
,
|
|
|
|
Цитата DesweR @ На самом деле ничто из этого не костыли. Это по-разному декомпозированная одна и та же идиома. Иногда проще один раз написать __try/__finally, чем RAIIшничать, например в нетривиальном конструкторе обособленнего класса. Но ИМХО клиентскому коду всегда следует предоставлять RAII-классы. Автор один раз написал, клиенты кучу раз используют. Очень жаль, что SEH в Дельфи является частью языка, а не его расширением, ибо это означает отсутствие альтернативы. Если я правильно понял, то идиома Scope Guard из C++ - как раз тот костыль try-finally из Delphi. |
|
Сообщ.
#5985
,
|
|
|
|
Цитата Qraizer @ Это по-разному декомпозированная одна и та же идиома. Не согласен finally не является идиомой освобождения ресурсов. Это "идиома" выполнения произвольного кода после блока try в не зависимости от того, произошло ли исключение. RAII же напрямую не связан с исключениями - это идиома владения ресурсами и автоматического их освобождения в отсутствии владельца. В частности, она бы была полезна и в С, без механизма исключений. |