Информация об изменениях

Сообщение Re[10]: Haters gonna hate but with proofs от 14.01.2019 10:18

Изменено 14.01.2019 11:00 rg45

Re[10]: Haters gonna hate but with proofs
Здравствуйте, netch80, Вы писали:

N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).


Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.

Другая проблема, другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.

Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):

        public static T Deserialize<T>(Stream input)
        {
            var textReader = new StreamReader(input);
            // че-то читаем из textReader

            using (var xmlReader = XmlReader.Create(textReader))
            {
                return Deserialize<T>(xmlReader);
            }
        }

или
        public static T Deserialize<T>(Stream input)
        {
            using (var textReader = new StreamReader(input))
            {
                // че-то читаем из textReader
                using (var xmlReader = XmlReader.Create(textReader))
                {
                    return Deserialize<T>(xmlReader);
                }
            }
        }


Или может, вообще можно без всяких using, как правильно?

И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.
Re[10]: Haters gonna hate but with proofs
Здравствуйте, netch80, Вы писали:

N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).


Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.

Другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.

Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):

        public static T Deserialize<T>(Stream input)
        {
            var textReader = new StreamReader(input);
            // че-то читаем из textReader

            using (var xmlReader = XmlReader.Create(textReader))
            {
                return Deserialize<T>(xmlReader);
            }
        }

или
        public static T Deserialize<T>(Stream input)
        {
            using (var textReader = new StreamReader(input))
            {
                // че-то читаем из textReader
                using (var xmlReader = XmlReader.Create(textReader))
                {
                    return Deserialize<T>(xmlReader);
                }
            }
        }


Или может, вообще можно без всяких using, как правильно?

И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.