Re[25]: есть ли в С# аналог std::auto_ptr ?
От: GlebZ Россия  
Дата: 14.06.11 12:14
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Это не так. Изменения допустимы, если транзакция — вложеная.

Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.

L>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.

Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
Re[26]: есть ли в С# аналог std::auto_ptr ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.06.11 12:16
Оценка:
Здравствуйте, GlebZ, Вы писали:

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


L>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.

GZ>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
А как в Dispose узнать, было ли выполнение кода нормальным или нет?
Re[26]: есть ли в С# аналог std::auto_ptr ?
От: Lloyd Россия  
Дата: 14.06.11 12:24
Оценка:
Здравствуйте, GlebZ, Вы писали:

L>>Это не так. Изменения допустимы, если транзакция — вложеная.

GZ>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.

Зачем? Они и так будут в объемлющей транзакции.

L>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.

GZ>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.

Но даже и этот вывод остался непонятен.

По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены.
По мне, так вполне логичный подход.
Re[27]: есть ли в С# аналог std::auto_ptr ?
От: _FRED_ Черногория
Дата: 14.06.11 12:56
Оценка: 8 (1) :)
Здравствуйте, samius, Вы писали:

L>>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.

GZ>>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.
S>А как в Dispose узнать, было ли выполнение кода нормальным или нет?

Руки бы поотрывал!
    public void Dispose()
    {
        if (Marshal.GetExceptionCode()==0)
            Console.WriteLine("Completed Successfully!");
        else
            Console.WriteLine("Exception!");
    }

http://ayende.com/blog/2577/did-you-know-find-out-if-an-exception-was-thrown-from-a-finally-block
Help will always be given at Hogwarts to those who ask for it.
Re[28]: есть ли в С# аналог std::auto_ptr ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.06.11 13:05
Оценка:
Здравствуйте, _FRED_, Вы писали:

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



S>>А как в Dispose узнать, было ли выполнение кода нормальным или нет?


_FR>Руки бы поотрывал!

За такое надо с головой их отрывать.
Re[27]: есть ли в С# аналог std::auto_ptr ?
От: GlebZ Россия  
Дата: 14.06.11 13:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>>>Это не так. Изменения допустимы, если транзакция — вложеная.

GZ>>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.
L>Зачем? Они и так будут в объемлющей транзакции.
Для того чтобы объемлющая транзакция могла зафиксироваться, каждая вложенная транзакция должны вызвать команду commit.

L>>>Как-то все равно все путанно и непонятен сделанный вывод. Рассказывал одно, потом взял и без какого-либо перехода объявил, что откат в Dispose — бред.

GZ>>Неверно. Я утверждал что отсутвие Complete в Dispose при нормальном выполнении кода — бред.

L>Но даже и этот вывод остался непонятен.

L>По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены.
L>По мне, так вполне логичный подход.
А по моему нет. В случае если код выполнился, и не было вызвано исключение, то транзакция должны быть закомичена. В случае если код сгенерил исключение, то безусловно роллбек.
Re[28]: есть ли в С# аналог std::auto_ptr ?
От: Lloyd Россия  
Дата: 14.06.11 13:30
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>>>Нет. Если транзакция вложенная (и то, там много своих определений), то все остается в силе. Создавай другую вложенную транзакцию.

L>>Зачем? Они и так будут в объемлющей транзакции.
GZ>Для того чтобы объемлющая транзакция могла зафиксироваться, каждая вложенная транзакция должны вызвать команду commit.

Да, но это не отвечает на заданный вопрос.

L>>По-моему, если пользователь явно задал границы транзакции с помощью TransactionScope, то явно же ее и должен закоммитить. Если ты не закоммитил, то это должно трактоваться как ошибка и сделанные изменения должны быть откачены.

L>>По мне, так вполне логичный подход.
GZ>А по моему нет. В случае если код выполнился, и не было вызвано исключение, то транзакция должны быть закомичена. В случае если код сгенерил исключение, то безусловно роллбек.

Нелогично. Раз уж ты объявил скоуп, то и коммить его.
Хотя это уже вопрос вкуса.
Re[28]: есть ли в С# аналог std::auto_ptr ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.06.11 14:49
Оценка:
Здравствуйте, _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>

_FR>http://ayende.com/blog/2577/did-you-know-find-out-if-an-exception-was-thrown-from-a-finally-block

public class ExceptionDetector : IDisposable
{
    public void Dispose()
    {
        if (Marshal.GetExceptionCode() == 0)
            Console.WriteLine("Completed Successfully!");
        else
            Console.WriteLine("Exception!");
    }
}

static void Main(string[] args)
{
    try
    {
        try
        {
            throw new NotImplementedException();
        }
        finally
        {
            using (new ExceptionDetector())
            {
                // no exception here!
            }
        }
    }
    catch (NotImplementedException)
    {
    }
}

Выводит в консоль "Exception!", чего следовало ожидать.
Re[6]: есть ли в С# аналог std::auto_ptr ?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.06.11 19:24
Оценка:
Здравствуйте, 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>>
AVK Blog
Re[20]: есть ли в С# аналог std::auto_ptr ?
От: k.o. Россия  
Дата: 15.06.11 15:23
Оценка:
Здравствуйте, 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 с шахматами и поэтессами?
Re[21]: есть ли в С# аналог std::auto_ptr ?
От: drol  
Дата: 15.06.11 18:09
Оценка:
Здравствуйте, k.o., Вы писали:

D>>Отлично. То есть Вам потребовалось написать явный вызов. И чем это отличается от явного вызова Dispose() ?


KO>Тем, что, flush не закрывает файл и у нас по прежнему есть неявный вызов деструктора.


То есть ничем. Я Вас правильно понял ?

KO>Проверять CloseHandle для файлов, это, пожалуй, черезчур параноидально.


Сценариев предостаточно. То что Вы их не видите — ну да, кто-то вон вообще всю жизнь лабает г-сайты на php

KO>Кроме того, если он всё-таки вернёт ошибку, разумнее, наверно, не исключение кидать, а поскорее умереть, сохранив перед этим crashdump.


Не надо вилять — отвечайте на вопрос прямо.

KO>А можно, подробнее, какие несовместимости в понимании лямбд есть у современных компиляторов C++?


Не знаю. А вот что знаю, так это то, что нового стандарта до сих пор нет Помимо этого я прекрасно помню epic fail'ы по части поддержки шаблонов и реализации стандартной библиотеки. И посему лично у меня нет никаких оснований предполагать безболезненное внедрение в C++ и вышеупомянутых новых фич.

KO>Ну, т.е. тоже делать свой using с шахматами и поэтессами?


Ну и зачем Вы это написали ? Какой Ваш тезис-то ? Или так побалакать ?
Re[22]: есть ли в С# аналог std::auto_ptr ?
От: k.o. Россия  
Дата: 15.06.11 18:39
Оценка:
Здравствуйте, 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]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.