Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 396 397 [398] 399 400 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5956
,
|
|
|
|
У меня даже опера месяцами не закрывается на работе |
|
Сообщ.
#5957
,
|
|
|
|
Цитата D_KEY @ Как это? RAII успешно справляется. Я же уже неоднократно писал об этом. Питоновские менеджеры контекста, шарповые using'и, новый явовский "try с ресурсами". И зачем в таком случае finally? Синтаксический сахар над try-finally. Для удобства. Но сути это не меняет. Добавлено Цитата IL_Agent @ http://msdn.microsoft.com/ru-ru/library/system.object.finalize.aspx Цитата Во время завершения работы домена приложения Finalize вызывается автоматически для объектов, которые не исключены из финализации, даже для тех, которые остаются доступными. Т.е. при закрытии приложения/выгрузке сборки оно таки будет вызвано. Майкрософтовский GC дергает каждый объект? О ужас... Добавлено D_KEY, т.е. ты придираешься к конкретному синтаксису try-finally, я же говорю о его назначении -- явным образом инициировать высвобождение конкретных ресурсов (в противовес автоматическому их высвобождению при уничтожении объекта). |
|
Сообщ.
#5958
,
|
|
|
|
Цитата korvin @ D_KEY, т.е. ты придираешься к конкретному синтаксису try-finally, я же говорю о его назначении -- явным образом инициировать высвобождение конкретных ресурсов (в противовес автоматическому их высвобождению при уничтожении объекта). А как тогда расценивать мой код? Это явное инициирование высвобождения, суть сахароза, или всё же автоматическое высвобождение при уничтожении, суть опора на детерминированный вызов деструкторов? Этот вопрос стал бы ещё важнее, будь в плюсах макросы по типу Nemerle - тогда было бы полное ощущение сахара. |
|
Сообщ.
#5959
,
|
|
|
|
Цитата MyNameIsIgor @ А как тогда расценивать мой код? Это явное инициирование высвобождения, суть сахароза, или всё же автоматическое высвобождение при уничтожении, суть опора на детерминированный вызов деструкторов? Так а почему ты не написал подобие locker'а, который уничтожался бы автоматически и освобождал ресурс? |
|
Сообщ.
#5960
,
|
|
|
|
Цитата korvin @ Так а почему ты не написал подобие locker'а, который уничтожался бы автоматически и освобождал ресурс? Чтобы показать аналог кода на Go. |
|
Сообщ.
#5961
,
|
|
|
|
Цитата MyNameIsIgor @ Чтобы показать аналог кода на Go. И только? Тогда это просто пример, что "так можно", не более. А так да, это ручная инициализация освобождения ресурсов и в C++ видимо не нужно. Или есть случаи, когда иначе никак? |
|
Сообщ.
#5962
,
|
|
|
|
Цитата korvin @ И только? Тогда это просто пример, что "так можно", не более. Это пример того, что так писать на плюсах можно - без написания локеров. Цитата korvin @ Или есть случаи, когда иначе никак? Да вроде всегда можно написать владельца ресурса... |
|
Сообщ.
#5963
,
|
|
|
|
Ну дык... и нафик тогда? Не думаю, что реализация классов-владельцев будет занимать больше места, чем Defer'ов, зато код, где они используются будет меньше захламлен.
|
|
Сообщ.
#5964
,
|
|
|
|
Цитата korvin @ Не думаю, что реализация классов-владельцев будет занимать больше места, чем Defer'ов Как раз наоборот. Такой defer пишется один раз на все случаи жизни... |
|
Сообщ.
#5965
,
|
|
|
|
Цитата korvin @ D_KEY, т.е. ты придираешься к конкретному синтаксису try-finally, я же говорю о его назначении -- явным образом инициировать высвобождение конкретных ресурсов (в противовес автоматическому их высвобождению при уничтожении объекта). Так это ты зациклился на синтаксисе. Вышеперечисленные средства не просто синтаксический сахар, это как раз смена "парадигмы" с "явного делания чего-то при выходе" на "захват ресурса и автоматическое его освобождение". И костыль в виде finally можно выпиливать. А что он делает в Delphi без GC - вообще не понятно |
|
Сообщ.
#5966
,
|
|
|
|
Во-во-во. Чё-то меня в спешке взгючило.
Цитата Flex Ferrum @ Та не. Это всё std::vector<bool> виноват. Скорее для вектора надо было бы через итераторы. Ага. В несознанке, видимо, писали. Потому что дальше операция [] также определяется через итераторы. Добавлено Цитата D_KEY @ На предмет "пары недель", а не "месяцев" у меня тоже есть опыт. Каждая активизация окна Оперы - минутные тормоза из-за свопа, а её в конце-концов завершение - ещё более длительные тормоза на очистку ресурсов и завершение процесса, хотя да, окошко пропадает сразу. У меня даже опера месяцами не закрывается на работе |
|
Сообщ.
#5967
,
|
|
|
|
Цитата D_KEY @ Так это ты зациклился на синтаксисе. Вышеперечисленные средства не просто синтаксический сахар, это как раз смена "парадигмы" с "явного делания чего-то при выходе" на "захват ресурса и автоматическое его освобождение". И костыль в виде finally можно выпиливать. А что он делает в Delphi без GC - вообще не понятно ![]() О! Синтаксический сахар у нас теперь называется парадигмой? Я тут на ЛОРе задал вопрос про переопределение методов, вот товарищ привел пример на Питоне: ![]() ![]() from contextlib import contextmanager @contextmanager def override(obj, **kwargs): oldvalues = dict((attr, getattr(obj, attr)) for attr in kwargs) for attr, value in kwargs.iteritems(): setattr(obj, attr, value)from contextlib import contextmanager @contextmanager def override(obj, **kwargs): oldvalues = dict((attr, getattr(obj, attr)) for attr in kwargs) for attr, value in kwargs.iteritems(): setattr(obj, attr, value) try: yield finally: for attr, value in oldvalues.iteritems(): setattr(obj, attr, value) class A(object): def id(self): return 0 a1 = A() a2 = A() with override(A, id=lambda self: 1): assert (a1.id(), a2.id()) == (1, 1) assert (a1.id(), a2.id()) == (0, 0) with override(a1, id=lambda: 2): assert a1.id() == 2 assert a1.id() == 0 try: yield finally: for attr, value in oldvalues.iteritems(): setattr(obj, attr, value) class A(object): def id(self): return 0 a1 = A() a2 = A() with override(A, id=lambda self: 1): assert (a1.id(), a2.id()) == (1, 1) assert (a1.id(), a2.id()) == (0, 0) with override(a1, id=lambda: 2): assert a1.id() == 2 assert a1.id() == 0 И что же мы видим? Оказывается, что Менеджер Контекста всего-навсего обычная обертка над try-finally, прям как в CL с 80-х годов... |
|
Сообщ.
#5968
,
|
|
|
|
Цитата korvin @ Менеджер Контекста всего-навсего обычная обертка над try-finally Потому что был введён в язык, где уже был finally. А если бы finally не было? |
|
Сообщ.
#5969
,
|
|
|
|
Цитата korvin @ О! Синтаксический сахар у нас теперь называется парадигмой? Синтаксический сахар - это один из способов обеспечения удобного использования парадигмы. То, что with в питоне сейчас реализован именно так, не является его семантическим свойством. Выпили finally из python 4, реализуй with иначе, но с сохранением той же семантики, и он перестанет быть синтаксическаим сахаром. |
|
Сообщ.
#5970
,
|
|
|
|
Цитата D_KEY @ Так это ты зациклился на синтаксисе. Вышеперечисленные средства не просто синтаксический сахар, это как раз смена "парадигмы" с "явного делания чего-то при выходе" на "захват ресурса и автоматическое его освобождение". И костыль в виде finally можно выпиливать. Да? А для нетривиальных ситуаций разве не нужно расставлять локальные блоки { ... } (а-ля try ... finally)? ![]() А на нетривиальную деинициализацию не нужно ничего биндить (а-ля finally ... end)? ![]() Те же уши только в профиль, ну и о каких костылях ты говоришь? Добавлено Если я правильно понял, то идиома Scope Guard из C++ - как раз тот костыль try-finally из Delphi. |