Здравствуйте, Lloyd, Вы писали:
L>Это не так. Изменения допустимы, если транзакция — вложеная.
Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.
L>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.
Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Lloyd, Вы писали:
L>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред. GZ>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
А как в Dispose узнать, было ли выполнение кода нормальным или нет?
Здравствуйте, GlebZ, Вы писали:
L>>Это не так. Изменения допустимы, если транзакция — вложеная. GZ>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.
Зачем? Они и так будут в объемлющей транзакции.
L>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред. GZ>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
Но даже и этот вывод остался непонятен.
По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены.
По мне, так вполне логичный подход.
Здравствуйте, samius, Вы писали:
L>>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред. GZ>>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред. S>А как в Dispose узнать, было ли выполнение кода нормальным или нет?
Руки бы поотрывал!
public void Dispose()
{
if (Marshal.GetExceptionCode()==0)
Console.WriteLine("Completed Successfully!");
else
Console.WriteLine("Exception!");
}
Здравствуйте, Lloyd, Вы писали:
L>>>Это не так. Изменения допустимы, если транзакция — вложеная. GZ>>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию. L>Зачем? Они и так будут в объемлющей транзакции.
Для того чтобы объемлющая транзакция могла зафиксироваться, каждая вложенная транзакция должны вызвать команду commit.
L>>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред. GZ>>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
L>Но даже и этот вывод остался непонятен. L>По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены. L>По мне, так вполне логичный подход.
А по моему нет. В случае если код выполнился, и не было вызвано исключение, то транзакция должны быть закомичена. В случае если код сгенерил исключение, то безусловно роллбек.
Здравствуйте, GlebZ, Вы писали:
GZ>>>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию. L>>Зачем? Они и так будут в объемлющей транзакции. GZ>Для того чтобы объемлющая транзакция могла зафиксироваться, каждая вложенная транзакция должны вызвать команду commit.
Да, но это не отвечает на заданный вопрос.
L>>По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены. L>>По мне, так вполне логичный подход. GZ>А по моему нет. В случае если код выполнился, и не было вызвано исключение, то транзакция должны быть закомичена. В случае если код сгенерил исключение, то безусловно роллбек.
Нелогично. Раз уж ты объявил скоуп, то и коммить его.
Хотя это уже вопрос вкуса.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, samius, Вы писали:
S>>А как в Dispose узнать, было ли выполнение кода нормальным или нет?
_FR>Руки бы поотрывал! _FR>
_FR> public void Dispose()
_FR> {
_FR> if (Marshal.GetExceptionCode()==0)
_FR> Console.WriteLine("Completed Successfully!");
_FR> else
_FR> Console.WriteLine("Exception!");
_FR> }
_FR>
Здравствуйте, GlebZ, Вы писали:
GZ>А точнее неправ. Иначе придется признать что Dispose является деструктором, что есть подлая ложь. Да и using не идеален. Я бы не отказался от расширения чтобы можно было вызывать не только Dispose. Что-то типа: GZ>
GZ>Stopwatch t=new Stopwatch();
GZ>using(t.Start())//указываем функцию начала
GZ>{
GZ>...
GZ>}(t.Stop());//указываем функцию завершения
GZ>Console.WriteLine(t.Elapsed);
GZ>
GZ>Счас на таких задачах приходится Dispose прокси делать.
В RX (и не только в нем) есть такой вариант:
var t = Stopwatch.StartNew();
using (Disposable.Create(t.Stop))
{
...
}
Console.WriteLine(t.Elapsed);
... << RSDN@Home 1.2.0 alpha 5 rev. 1495 on Windows 7 6.1.7601.65536>>
Здравствуйте, drol, Вы писали:
D>Здравствуйте, k.o., Вы писали:
KO>>Тут дело даже не столько в ресурсах, сколько в способе работы с ними.
D>Это две стороны одной медали.
KO>>
D>file data("....");
D>// пишем что-то в файл
D>data.flush(); // здесь может вылететь птичка
D>
D>Отлично. То есть Вам потребовалось написать явный вызов. И чем это отличается от явного вызова Dispose() ?
Тем, что, flush не закрывает файл и у нас по прежнему есть неявный вызов деструктора.
KO>>Смысл в том, что все операции, которые могут завершиться ошибкой лучше делать явно, а задача деструктора, вернуть ресурс туда где взяли. KO>>При таком подходе они действительно очень удобны. Иначе мы либо теряем первоначальную ошибку, либо ошибку при завершении работы с ресурсом.
D>Ничего не понял. Хоть ты тресни, но даже простецкий CloseHandle может вернуть ошибку. И я хочу её знать. Что тогда остаётся в коде деструктора ??? И как Вы из него информацию об ошибке собрались извлекать ???
Проверять CloseHandle для файлов, это, пожалуй, черезчур параноидально. Кроме того, если он всё-таки вернёт ошибку, разумнее, наверно, не исключение кидать, а поскорее умереть, сохранив перед этим crashdump.
KO>>Тем не менее, на лямбдах можно вполне себе сделать вменяемый аналог using.
D>Угу-угу. И потом ещё ждать десять лет, пока компиляторы C++ научатся их понимать одинаковым образом
А можно, подробнее, какие несовместимости в понимании лямбд есть у современных компиляторов C++?
KO>>оно и в C# не очень красиво будет выглядеть, using\IDisposable тут не помогут.
D>В C# тоже есть лямбды, и много чего ещё впридачу
Ну, т.е. тоже делать свой using с шахматами и поэтессами?
Здравствуйте, k.o., Вы писали:
D>>Отлично. То есть Вам потребовалось написать явный вызов. И чем это отличается от явного вызова Dispose() ?
KO>Тем, что, flush не закрывает файл и у нас по прежнему есть неявный вызов деструктора.
То есть ничем. Я Вас правильно понял ?
KO>Проверять CloseHandle для файлов, это, пожалуй, черезчур параноидально.
Сценариев предостаточно. То что Вы их не видите — ну да, кто-то вон вообще всю жизнь лабает г-сайты на php
KO>Кроме того, если он всё-таки вернёт ошибку, разумнее, наверно, не исключение кидать, а поскорее умереть, сохранив перед этим crashdump.
Не надо вилять — отвечайте на вопрос прямо.
KO>А можно, подробнее, какие несовместимости в понимании лямбд есть у современных компиляторов C++?
Не знаю. А вот что знаю, так это то, что нового стандарта до сих пор нет Помимо этого я прекрасно помню epic fail'ы по части поддержки шаблонов и реализации стандартной библиотеки. И посему лично у меня нет никаких оснований предполагать безболезненное внедрение в C++ и вышеупомянутых новых фич.
KO>Ну, т.е. тоже делать свой using с шахматами и поэтессами?
Ну и зачем Вы это написали ? Какой Ваш тезис-то ? Или так побалакать ?
Здравствуйте, drol, Вы писали:
D>Здравствуйте, k.o., Вы писали:
D>>>Отлично. То есть Вам потребовалось написать явный вызов. И чем это отличается от явного вызова Dispose() ?
KO>>Тем, что, flush не закрывает файл и у нас по прежнему есть неявный вызов деструктора.
D>То есть ничем. Я Вас правильно понял ?
Видимо нет, но что-то у меня появились сомнения в желании понять.
KO>>Проверять CloseHandle для файлов, это, пожалуй, черезчур параноидально.
D>Сценариев предостаточно. То что Вы их не видите — ну да, кто-то вон вообще всю жизнь лабает г-сайты на php
Ну так опиши эти сценарии, мне правда интересно.
KO>>Кроме того, если он всё-таки вернёт ошибку, разумнее, наверно, не исключение кидать, а поскорее умереть, сохранив перед этим crashdump.
D>Не надо вилять — отвечайте на вопрос прямо.
На какой вопрос я не ответил? Что должно быть в деструкторе? Если действительно хочется получать информацию об ошибках CloseHandle, то вызов кода, сохраняющего crashdump и прибивающего приложение, возможно с записью в лог и предложением перезапустить приложение.
KO>>А можно, подробнее, какие несовместимости в понимании лямбд есть у современных компиляторов C++?
D>Не знаю. А вот что знаю, так это то, что нового стандарта до сих пор нет Помимо этого я прекрасно помню epic fail'ы по части поддержки шаблонов и реализации стандартной библиотеки. И посему лично у меня нет никаких оснований предполагать безболезненное внедрение в C++ и вышеупомянутых новых фич.
Т.е. это всё домыслы. Современные компиляторы, в т.ч. gcc, компилятор от MS, icc, достаточно давно и достаточно хорошо поддерживают лямбды. Даже если случится чудо и новый стандарт не выйдет, эту поддержку уже не выкинут, чтобы не ломать существующий код.
KO>>Ну, т.е. тоже делать свой using с шахматами и поэтессами?
D>Ну и зачем Вы это написали ? Какой Ваш тезис-то ? Или так побалакать ?
Мне было интересно как ты видишь работу с ресурсами в C#. Если использовать обычный using, то при броске исключения из Dispose потеряется исключение, которое могло быть кинуто в блоке using. Если использовать try/catch/finally и явный вызов Dispose, код получится не самый красивый, можно сделать свой using, может быть, можно ещё что-то сделать. Какой вариант ты предлагаешь?
[offtopic]
Что-то мне начинает казаться, у тебя вообще нет желания конструктивную беседу вести.
[/offtopic]