Re[12]: есть ли в С# аналог std::auto_ptr ?
От: _FRED_ Черногория
Дата: 10.06.11 04:32
Оценка: +1
Здравствуйте, drol, Вы писали:

D>>>Где Вы это увидели ??? "should generally", да ещё и в каком-то там примечании это определённо не запрет.

_FR>>Что значит "где"?
D>Э-э-э... Вам объяснить как переводится выражение с "should generally" ? И чем примечание отличается от собственно текста пункта "Стандарта" ?

Согласен, с "явно запрещено" я переборщил.
Help will always be given at Hogwarts to those who ask for it.
Re[12]: есть ли в С# аналог std::auto_ptr ?
От: catBasilio  
Дата: 10.06.11 04:39
Оценка: -1
Здравствуйте, drol, Вы писали:

D>Здравствуйте, catBasilio, Вы писали:


B>>исключение вышедшее за границы деструктора — результат вызов terminate() и завершение программы.


D>Ничего подобного. terminate() будет только если исключение выброшено из деструктора в ходе раскрутки стека. Во всех остальных случаях проблем нет.


Пример остальных случаев пожалуйста.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[6]: есть ли в С# аналог std::auto_ptr ?
От: Aviator  
Дата: 10.06.11 06:59
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Aviator, Вы писали:


A>>Не хочу ввязываться в дискуссию, представьте на досуге что будет в c#, если ресурс A агрегирует ресурс B, который в свою очередь агрегирует С. Ресурсы B и C надо явно освободить по освобождению A.


D>А теперь представьте, что в процессе освобождения ресурса C произошла ошибка, и информацию об оной нужно отправить дальше по callstack'у тем, кто знает что в этом случае делать.

И что вы будете делать с ошибкой при освобождении ресурса выше по стеку если не секрет?

ЗЫ При исключении из диспоуза вас не смущает, что часть ресурсов корректно освобождена а часть повисла в непонятном состоянии?
Re[7]: есть ли в С# аналог std::auto_ptr ?
От: GlebZ Россия  
Дата: 10.06.11 07:04
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

L>Зачем что-то еще?

Дядька — using тоже синтаксический сахар finally с IDisposable. Вопрос другой, что выглядит лучше и понятней, поэтому используют именно его, а не finally. Я широко использую using без освобождения ресурсов. В этом случае прекрасно видны границы работы функций. Но для этого приходится генерить прокси классы.
Re[8]: есть ли в С# аналог std::auto_ptr ?
От: Ziaw Россия  
Дата: 10.06.11 07:14
Оценка: 1 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Дядька — using тоже синтаксический сахар finally с IDisposable. Вопрос другой, что выглядит лучше и понятней, поэтому используют именно его, а не finally. Я широко использую using без освобождения ресурсов. В этом случае прекрасно видны границы работы функций. Но для этого приходится генерить прокси классы.


Я использую хелпер.
        class Scope: IDisposable
        {
            private readonly Action onDispose;

            public Scope(Action onDispose)
            {
                this.onDispose = onDispose;
            }

            public void Dispose()
            {
                onDispose();
            }
        }

        // пример использования
        public IDisposable InTransaction(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
        {
            BeginTransaction(isolationLevel);

            return new Scope(() =>
                                 {
                                     if (Transaction != null)
                                         CommitTransaction();
                                 });
        }
        void foo()
        {
           using (InTransaction())
           {
              // some logic
           }
        }
Re[13]: есть ли в С# аналог std::auto_ptr ?
От: k.o. Россия  
Дата: 10.06.11 07:30
Оценка: +1
Здравствуйте, catBasilio, Вы писали:

B>Здравствуйте, drol, Вы писали:


D>>Здравствуйте, catBasilio, Вы писали:


B>>>исключение вышедшее за границы деструктора — результат вызов terminate() и завершение программы.


D>>Ничего подобного. terminate() будет только если исключение выброшено из деструктора в ходе раскрутки стека. Во всех остальных случаях проблем нет.


B>Пример остальных случаев пожалуйста.


пример

Раскрутка стека происходит при броске исключения, во всех остальных случаях её нет и вызов terminate не происходит.
Re[16]: есть ли в С# аналог std::auto_ptr ?
От: Angler Россия  
Дата: 10.06.11 07:31
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Angler, Вы писали:


A>>Возможность существования никто и не отрицает.


D>Так зачем Вы тогда пытались заболтать тему, ежели согласны с ложностью выдвинутого "конкурирующей организацией" тезиса


Возможность то есть, но за наличие трывают руки(как вариант — отрезаешь себе со временем уши). Такой себе сферический конь в вакууме..
Re[6]: есть ли в С# аналог std::auto_ptr ?
От: k.o. Россия  
Дата: 10.06.11 07:34
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Aviator, Вы писали:


A>>Не хочу ввязываться в дискуссию, представьте на досуге что будет в c#, если ресурс A агрегирует ресурс B, который в свою очередь агрегирует С. Ресурсы B и C надо явно освободить по освобождению A.


D>А теперь представьте, что в процессе освобождения ресурса C произошла ошибка, и информацию об оной нужно отправить дальше по callstack'у тем, кто знает что в этом случае делать.


а что делать с ошибкой, которая привела к вызову Dispose и информацию о которой тоже нужно отправить дальше?
Re[8]: есть ли в С# аналог std::auto_ptr ?
От: Lloyd Россия  
Дата: 10.06.11 08:06
Оценка:
Здравствуйте, GlebZ, Вы писали:

L>>Зачем что-то еще?

GZ>Дядька — using тоже синтаксический сахар finally с IDisposable.

Спасибо, мальчик. Ты решил поиграть в капитана? Похвально.

GZ>Вопрос другой, что выглядит лучше и понятней, поэтому используют именно его, а не finally.


Уверяю тебя, тот код, котрый ты привел точно не используют, т.к. он даже не скомпилится.

GZ>Я широко использую using без освобождения ресурсов. В этом случае прекрасно видны границы работы функций. Но для этого приходится генерить прокси классы.


Тот вариант, что ты привел — весьма сомнителен. Если уж хочется непременно использовать using, то можно придумать более понятные варианты даже не выходя за рамки существующего языка.
Re[4]: есть ли в С# аналог std::auto_ptr ?
От: Aviator  
Дата: 10.06.11 08:16
Оценка: :)
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Aviator, Вы писали:


A>>А вообще, using это каменный век по сравнению с работой деструкторов...

HL>Толсто троллите.
Это крик души
Re[7]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 10.06.11 09:35
Оценка: :)
Здравствуйте, Aviator, Вы писали:

A>И что вы будете делать с ошибкой при освобождении ресурса выше по стеку если не секрет?


Что захочу, то и сделаю. В рамках примера с распределённой транзакцией — можно просто сразу повторить транзакцию, можно зашедулить повторение через таймаут, можно написать в лог, можно спросить пользователя, можно проанализировать причину отказа и выдать рекомендации и т.д., и т.п., и даже всё сразу

A>ЗЫ При исключении из диспоуза вас не смущает, что часть ресурсов корректно освобождена а часть повисла в непонятном состоянии?


Ничто и нигде не повисло — catch\finally-блоки обо всём позаботятся. В отличии от деструкторов С++ им ведь доступна вся информация о ситуации.
Re[8]: есть ли в С# аналог std::auto_ptr ?
От: Aviator  
Дата: 10.06.11 10:42
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Aviator, Вы писали:


A>>И что вы будете делать с ошибкой при освобождении ресурса выше по стеку если не секрет?


D>Что захочу, то и сделаю. В рамках примера с распределённой транзакцией — можно просто сразу повторить транзакцию, можно зашедулить повторение через таймаут, можно написать в лог, можно спросить пользователя, можно проанализировать причину отказа и выдать рекомендации и т.д., и т.п., и даже всё сразу


Проанализировать причину отказа при освобождении ресурса? Что курим? Может мессаджбокс ещё юзеру покажешь "Извини, не могу освободить ресурс" ?

A>>ЗЫ При исключении из диспоуза вас не смущает, что часть ресурсов корректно освобождена а часть повисла в непонятном состоянии?


D>Ничто и нигде не повисло — catch\finally-блоки обо всём позаботятся. В отличии от деструкторов С++ им ведь доступна вся информация о ситуации.

Что им доступно, ты не освободил половину ресурсов, половина уже грохнута, причём последний вызов завершился с исключением. Что будет при убивании оставшейся половины — одному богу известно и будет отлично проглочено при вызове финализатора.
Re[9]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 10.06.11 11:40
Оценка:
Здравствуйте, Aviator, Вы писали:

A>Проанализировать причину отказа при освобождении ресурса?


Ага. Например, если транзакция не прошла, и я вижу в цепочках исключений какой-нибудь SocketClosedByTimeoutException, то можно проверить состояние сети, видимость сервера и т.п. И, соответственно, много чего интеллектуального сделать на эту тему — поставить мониторинг на восстановление связи, зашедулить повтор транзакции и т.д.

A>Что курим?


Да уж явно не то что освободители ресурсов в деструкторах глотающие все ошибки

A>Может мессаджбокс ещё юзеру покажешь "Извини, не могу освободить ресурс" ?


Если есть разумный use case с UI — конечно же покажу.

A>Что им доступно, ты не освободил половину ресурсов, половина уже грохнута, причём последний вызов завершился с исключением.


Вот именно что с исключением. А нормальное исключение явно говорит в чём проблема.

A>Что будет при убивании оставшейся половины — одному богу известно


Насчёт бога не знаю, а вот мне обычно прекрасно известно что может быть. Программные системы они того — детерминированные, знаете ли.

A>и будет отлично проглочено при вызове финализатора.


Финализатор здесь совершенно не при делах, бо он вызывается в случае, когда информация об ошибочных ситуациях как раз не нужна. И деструкторы C++ как раз являются аналогом финализатора в этом плане.
Re[10]: есть ли в С# аналог std::auto_ptr ?
От: Aviator  
Дата: 10.06.11 11:52
Оценка:
Здравствуйте, drol, Вы писали:
То что в при исключении не все диспоузы отработают — это не напрягает?
Re[11]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 10.06.11 12:05
Оценка:
Здравствуйте, Aviator, Вы писали:

A>То что в при исключении не все диспоузы отработают


С каких это ??? В общем случае все finally-блоки по пути всегда исполняются. Если нужна более сложная схема — пожалуйста, можно явные catch'и понаписать, и логику освобождения какую душе угодно.
Re[7]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 10.06.11 12:31
Оценка:
Здравствуйте, k.o., Вы писали:

KO>а что делать с ошибкой, которая привела к вызову Dispose и информацию о которой тоже нужно отправить дальше?


Если Вас она интересует — пожалуйста, пишите явные catch'и, и Вы сможете переправить наверх вообще всё дерево исключений порождённое вызовом.
Re[12]: есть ли в С# аналог std::auto_ptr ?
От: Aviator  
Дата: 10.06.11 12:32
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Aviator, Вы писали:


A>>То что в при исключении не все диспоузы отработают


D>С каких это ??? В общем случае все finally-блоки по пути всегда исполняются. Если нужна более сложная схема — пожалуйста, можно явные catch'и понаписать, и логику освобождения какую душе угодно.


У тебя из finally вылетает исключение
Re[9]: есть ли в С# аналог std::auto_ptr ?
От: GlebZ Россия  
Дата: 10.06.11 13:32
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Спасибо, мальчик. Ты решил поиграть в капитана? Похвально.

Ты что, обиделся? Это просто у меня такое выражение. Ничего личного, и никого не хотел оскорбить.

GZ>>Вопрос другой, что выглядит лучше и понятней, поэтому используют именно его, а не finally.

L>Уверяю тебя, тот код, котрый ты привел точно не используют, т.к. он даже не скомпилится.
Тот код который я привел как не является юзингом, так и не являеся кодом. Это просто пример.
И вообще, я говорю о двух недостатках using, который ограничивает его использование:
1. Привязка к IDisposable
2. Привязка к finally.
По первой понятно из кода. По второй, я грешен не указал, — мы не имеем информации как мы пролетаем по finally, через exception или нормальным исполнением.

GZ>>Я широко использую using без освобождения ресурсов. В этом случае прекрасно видны границы работы функций. Но для этого приходится генерить прокси классы.

L>Тот вариант, что ты привел — весьма сомнителен. Если уж хочется непременно использовать using, то можно придумать более понятные варианты даже не выходя за рамки существующего языка.
Ну да. Например: этот
Автор: Ziaw
Дата: 10.06.11
. Я счас присмотрелся, пример интересный, но неправильный. В случае exception транзакция подтвердится.
Попробуй напиши правильно, чтобы можно было делать а ля ScopeTransaction но без явного и бесполезного указания Commit.
Re[13]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 10.06.11 13:42
Оценка:
Здравствуйте, Aviator, Вы писали:

A>У тебя из finally вылетает исключение


Да без разницы откуда оно вылетает — finally-блоки поэтому и finally, бо в нормальном потоке исполнения они отрабатывают в независимости от того что и откуда вылетело. Если в finally нужна логика в которой возможны свои исключения — ну так пишите try\catch и ловите их там.
Re[10]: есть ли в С# аналог std::auto_ptr ?
От: Lloyd Россия  
Дата: 10.06.11 13:45
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>>>Вопрос другой, что выглядит лучше и понятней, поэтому используют именно его, а не finally.

L>>Уверяю тебя, тот код, котрый ты привел точно не используют, т.к. он даже не скомпилится.
GZ>Тот код который я привел как не является юзингом, так и не являеся кодом. Это просто пример.

О том и речь. Потому говорить "используют именно его" некорректно.

L>>Тот вариант, что ты привел — весьма сомнителен. Если уж хочется непременно использовать using, то можно придумать более понятные варианты даже не выходя за рамки существующего языка.

GZ>Ну да. Например: этот
Автор: Ziaw
Дата: 10.06.11
. Я счас присмотрелся, пример интересный, но неправильный. В случае exception транзакция подтвердится.

GZ>Попробуй напиши правильно, чтобы можно было делать а ля ScopeTransaction но без явного и бесполезного указания Commit.

Там просто не надо было использовать using, он там не нужен.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.