1. C# / Говнокод #10358

    +110

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    PropertyAdminFormModel data = new PropertyAdminFormModel
                    { 
                        DateFinish = rep.DateFinish,
                        Name = rep.Name,
                        ReportingCircleId = rep.ReportingCircleId
                    };
    
                    if (data != null)
                    {
                        Id = reportId;
                        Name = data.Name;
                        DateFinish = data.DateFinish;
                        ReportingCircleId = data.ReportingCircleId;
                    }

    А вдруг!? =)

    Запостил: DukeGonzo, 24 Мая 2012

    Комментарии (31) RSS

    • Неуверенный программист.
      Вариант: сишник старой закалки. Выделение памяти надо проверять! А не надеяться на авось и много памяти и исключения
      Ответить
      • Вариант номер 3: В Сишарпе запилили выполнение по необходимости.
        Ответить
    • показать все, что скрытоЧто за синтаксис инициализации с фигурными скобочками?
      Ответить
      • Это равносильно,
        PropertyAdminFormModel data = new PropertyAdminFormModel();
        data.DateFinish = rep.DateFinish;
        data.Name = rep.Name;
        data.ReportingCircleId = rep.ReportingCircleId;
        Ответить
        • Из Ады спиздили...
          Ответить
          • показать все, что скрытоможете пояснить
            насколько я знаю то этот синтаксис вышел вместе с C# 3.0, то ли в 2004, то ли в 2005
            Ответить
          • Из жабы, откуда ж еще. А вот откуда спиздили это сан - другой вопрос.

            >с C# 3.0, то ли в 2004, то ли в 2005
            Лол. Ada, Java гораздо древнее.
            Ответить
            • Интересно было бы узнать, давно ли жабе появился такой сахарок
              Ответить
              • http://www.artima.com/designtechniques/initializationP.html
                >Instance initializers
                Java 1.1 introduced the instance initializer, which is also called the instance initialization block
                Добавили вместе с inner-классами.
                Но вообще идея неймспесов совершенно органичная, в ней нет какой-то особой оригинальности.
                Ответить
                • Это не совсем тот блок инициализации, какой присутствует в java. В java приходится создавать анонимный подкласс, что не всегда возможно (да и obj.getClass() будет возвращать что-то внезапное). В C# просто сахарок, чтобы имя переменной с точкой не нужно было много раз писать. Подозреваю, что оно и с "финальными" классами (не знаю уж, есть ли они там) должно работать.
                  Ответить
                • На J2ME пишешь?
                  Ответить
        • сахарок ... понятно
          Ответить
        • Нет, не равносильно
          Ответить
          • как нет?
            а что тогда получается?
            Ответить
            • Немного другое, твой вариант не "атомарен"
              Ответить
              • С этого места поподробнее, пожалуйста. Каким боком конструкторы вообще должны быть атомарны?
                Ответить
                • Person person = null;
                  var tempPerson = new Person();
                  tempPerson.Name = "a";
                  tempPerson.Age = 2;
                  person = tempPerson;

                  Тут инициализация person атомарна, он либо null, либо полностью инициализирован, нет никаких неопределенных состояний.

                  var person = new Person();
                  person.Name = "a";
                  person.Age = 2;

                  А тут нет - ибо нет никакого способа определить, полностью ли инициализирован person? Сколько надо ждать до его инициализации? Можно ли с ним уже работать из другого потока?
                  Ответить
                  • Person person = null;
                    var tempPerson = new Person();
                    tempPerson.Name = "a";
                    tempPerson.Age = 2;
                    person = tempPerson;

                    Или я не понимаю c#, или вы не знаете что такое memory ordering. На c/c++ за такой код в многопоточке убивают.
                    Ответить
                    • http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
                      Ответить
                      • Ок. Причем тут volatile? Как связаны ссылочные переменные и volatile? Или у тебя ссылки так часто меняются, что аж volatile приходится использовать?

                        >>вы не знаете что такое memory ordering
                        не знаю
                        >>На c/c++ за такой код в многопоточке убивают
                        ну.. компилятору ведь можно такой код генерить..
                        Ответить
                        • > Ок. Причем тут volatile?
                          Раз вы упомянули атомарность - значит мы рассматриваем многопоточную программу.

                          Допустим ваш код выполняется в одном потоке, а использовать переменную в другом будут при помощи такого кода:
                          if (person != null) { .. делаем что-то .. }

                          Ваш код выделяет объект, корректно заполняет его и выкладывает ссылку в переменную person. Т.к. c# (в отличие от с/c++) при любой записи вываливает весь кеш в оперативную память, в оперативной памяти будет корректно размещен и сам объект и ссылка на него.

                          Но к сожалению, т.к. переменная не объявлена как volatile, второму процу никто ничего об этом не сказал, и когда он случайно (да, да, случайно) перечитает страничку кеша в которой лежит person он обрадуется и пойдет им пользоваться. При этом, с ненулевой вероятностью, забыв прочитать вторую страничку кеша, в которой собственно валялся объект...

                          Как результат программу разносит в клочья (в лучшем случае) или кто-то не получает зарплату (в лучшем случае вы).

                          > не знаю
                          жаль

                          > ну.. компилятору ведь можно такой код генерить..
                          Без volatile с\с++ компилятор имеет полное право сделать из вашего кода вот такой (и, что характерно, сделает!):
                          Person person = new Person();
                          person.Name = "a";
                          person.Age = 2;
                          Насчет компилятора c# не знаю, т.к. с c# не работаю.
                          Ответить
                  • Кажется понял, какую атомарность вы имели в виду.

                    Есть глобальная переменная (ну или член класса) Person person = null.

                    Есть некая функция, которая хочет поместить туда инфу о новом человеке. И если она будет выглядеть так:

                    person = newPerson();
                    person.name = "a";
                    person.age = 2;

                    То при возникшем исключении person может остаться в неопределенном состоянии.

                    А конструктор с {...} атомарен в том плане, что либо он создает объект, заполняет все поля и после этого происходит присваивание. Либо, если в конструкторе возникло исключение - присваивания не
                    происходит вообще.

                    Т.е. это просто синтаксический сахар, позволяющий не писать временную переменную:
                    Person tempPerson = new Person();
                    tempPerson.name = "a";
                    tempPerson.age = 2;
                    person = tempPerson;

                    Вот только про потоки тут упоминать не следовало.
                    Ответить
                    • P.S. и uusb зря ругаете, код действительно равносилен.
                      Ответить
                      • Ну откройте ildasm и посмотрите
                        Ответить
                        • Исходник: http://pastebin.com/C2ZvuiL5
                          Выхлоп monodis'а: http://pastebin.com/ZRX3mN65

                          Да, вы правы, он создал временную переменную и после инициализации скопировал ее в нужную.

                          Если бы data в коде ОП'а была бы глобальной или членом класса, или хотя бы была описана над try..catch блоком - тогда подобная конструкция безусловно необходима.

                          Но т.к. и в коде ОП'а и в коде uusb мы видим локальную переменную, которую до окончания инициализации никто никуда не передал, то при исполнении эти коды будут эквивалентны. Так как при возникновении исключения в конструкторе или инициализации полей не будет выполнен код, который шел после инициализации - никто не воспользуется недоделанным объектом.
                          Ответить
    • показать все, что скрытоможете пояснить
      насколько я знаю то этот синтаксис вышел вместе с C# 3.0, то ли в 2004, то ли в 2005
      Ответить

    Добавить комментарий