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

    +5

    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
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    using System;
    
    namespace ConsoleApplication13
    {
        class Program
        {
            private static void Main(string[] args)
            {
                var s = new MyStruct(1);
    
                Console.WriteLine(s);
    
                s.Change(2);
                
                Console.WriteLine(s);
    
                ((IChangable)s).Change(3);
    
                Console.WriteLine(s);
    
                var o = (IChangable) s;
    
                ((MyStruct) o).Change(4);
    
                Console.WriteLine(o);
    
            }
    
            interface IChangable
            {
                void Change(int x);
            }
    
            struct MyStruct:IChangable
            {
                private int _value;
    
                public MyStruct(int x)
                {
                    _value = x;
                }
    
                public void Change(int x)
                {
                    _value = x;
                }
    
                public override string ToString()
                {
                    return "Value is " +_value;
                }
            }
        }
    }

    Угадываем что выведет программа и почему

    Запостил: kegdan, 28 Апреля 2016

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

    • Налетай, торопись, отвечай
      Ничего в замен не получай
      Ответить
    • Забавно. Оказывается структуры в сишарпике не такие уж и иммутабельные.
      Ответить
    • Ну и говно же C#: создание экземпляра интерфейса вместо класса/структуры, приведение к интерфейсу и обратно.

      Не удержался, запустил. Комп распидорасило, пишу с утюга.

      Ставлю плюс.
      Ответить
      • Согласен. Шарп говно. PHP говно. JS говно. Java говно. C++ говно. C говно. Asm говно.
        На чём писать, товарисчи???
        Ответить
        • Всё же, пишите на JS и Asm. Там упоротых кастов, делающих не пойми что, нет. Только определённые опереции.
          Ответить
          • >Там упоротых кастов, делающих не пойми что, нет.
            '5'+3 = 53
            '5'-3 = 2
            Ответить
            • Так это понятные опереции. Никто не умер. А теперь пойдём накресты:
              typedef Derived* PDerived;
              typedef Base* PBase;
              
              Derived d;
              PDerived pd = &d;
              
              (PBase) pd; // всё хорошо
              (Base) d; // хреново распитушение
              Ответить
              • Хуясе понятные. Это я еще таблицу сравнения в рнр 15*15 не упоминал.
                Ответить
                • Я каждый день складываю массивы в PHP. Борманд каждый день складывает массивы в PHP. Кегдан каждый день складывает массивы в PHP. Страуструп перед тем, как добавить новую фичу в кресты, складывает массивы в JS для души.
                  Сколько останется от 15*15, если оставить только используемое в здравом уме?

                  А тут в C# при касте к родителю создаётся копия объекта, которая ведёт себя как исходный объект, но никак с ним не связана. И то, не всегда (см. комментарий Кегдана ниже).
                  Ответить
                  • P.S. Вот сложение массивов - как раз тот пример, из-за которого JS - говно. Пользователь ожидает длинный массив с элементами первых двух, а получает строку :(
                    Ответить
                  • >Сколько останется от 15*15, если оставить только используемое в здравом уме?
                    А "неиспользуемое в здаром уме" уже не надо читать?

                    >А тут в C# при касте к родителю создаётся копия объекта, которая ведёт себя как исходный объект, но никак с ним не связана. И то, не всегда (см. комментарий Кегдана ниже).
                    До рнр все-таки еще далеко.
                    Ответить
                    • > А "неиспользуемое в здаром уме" уже не надо читать?
                      Можно не читать. Если оно работает - пусть работает. Если не работает, легче заново переписать, т.к. явно умножение объектов в подобном коде - самое безобидное.
                      Ответить
                      • Куда пропал 1023?
                        Ответить
                        • Выключил ЭВМ с рабочей питушнёй и пошёл отдыхать на новогодних выходных и смотреть телевизор. Там по случаю праздников столько интересного показывали, что я даже на карманной питушне для звонков не смотрел интернеты. А потом работа пошла, а я уже от срачей отвык.
                          Ответить
                          • Какой багор )))
                            Ответить
                          • Пошли бухать.
                            Ответить
                            • Не пойду. Это либо вредно, либо дорого, либо дорого и вредно. Начинается всё с бутылки вина за 0.01 ё.е., а потом внезапно пропивается 1 ё.е.
                              Ответить
              • > // хреново распитушение
                ну ты понятия не подменяй

                у тебя есть дочерний объект
                ты хочешь использовать этот объект как родительский - ты берешь и кастишь указатели или ссылки (возможно даже неявно) и используешь как родительский, а результатом такого каста является новый объект типа "указатель" или "ссылка"

                http://ideone.com/X6zjCk

                а то, что ты написал - сделай ка мне из объекта d новый объект родительского класса, т.к. хочешь в ответ получить именно объект другого класса, и обычно такая операция не определена, на что тебе и указывает компилятор

                и да, ты её даже можешь определить в дочернем классе, ну или при определенной степени упоротости - в родительском, и тогда она тоже заработает и будет делать то, что написано
                Ответить
                • Даже есть бы такой каст был возможен, но объект типа в куче изменил бы свою структуру и все остальные объекты, ссылающиеся на него - тоже. Тип Derived просто стал копией Base.

                  Бредор какой-то
                  Ответить
                • > обычно такая операция не определена

                  Я может чего не понял, но разве конструктор копирования не подойдёт? Просто slicing будет.

                  > указывает компилятор
                  А где посмотреть, что сказал компилятор 1024--?
                  Мой компилятор счастлив. Да и почему бы нет?
                  Ответить
              • Кстати, в крестах Slicing хотят сломать. Распетушения больше не будет.
                Ответить
              • Про это есть смешное место в коме.

                Там Petuh наследуется от BasePetuh.
                Далее, жертве дают указатель на Petuh, и говорят скастить его в указатель на войд.
                Далее, жертве дают скащенный в войд указатель, и говорят скастиь его в указаель на BasePetuh.

                В этом месте происходит хуесосинг, потому что компилятор не знает, что указатель указывает на Petuh а не на BasePetuh, и смещение у членов там другое.
                Ответить
                • А зачем что-то кастить в воид и обратно?
                  Ответить
                  • Я уже забыл, но кажется там был такой всратый сигнатур.

                    В общем цимес в том, что если в сгинатуре явно указан указатель на BasePetuh, то умненький компилятор правильно превращает в него Petuh. А если void, то нужно тявно кастить;
                    Ответить
                  • а, я вспомнил какашню кажется.

                    Каждый компитушочек должен релизовывать метод
                    QueryInterface(REFIID riid, void **ppv)


                    Задача компитушочка покласть в ppv указатель на нужный интерфейс.
                    Клиент потом кастанёт ppv в нужный интерфейс. Но клиент в другом бинаре.

                    Теперь представь себе, что у тебя класс занаследован от Petuh1, Petuh2 и Petuh3.
                    Ты присваиваешь ppv this.
                    Клиент кастит ppv в Petuh3.

                    Что случится? Как клиент найдет нужные члены?

                    Именно потому хоть в сишке и можно присвоить войду что угодно, всё равно нужно явно апкастить.


                    Пиздец, мы как всегда говорим про технологию, которая устарела, когда некоторые из говнокодеров сидели у папы в яйцах
                    Ответить
          • Ага, нету.
            https://www.destroyallsoftware.com/talks/wat
            Ответить
            • Ну и где упоротые касты?
              Сравнили зачем-то применение LSP с проверкой языка на прочность.
              В примере Кегдана разумные действия приводят к странным результатам. Здесь же странные действия приводят к странным результатам.
              В JS можно выстрелить себе в ногу только холостым патроном (NaN) из незаряженного ружья (undefined), сев на коня задом наперёд.
              Ответить
              • Не желаешь оседлать моего скакуна? Он унесёт тебя вдаль по дороге страсти.
                Ответить
        • на LUA, Python, Ruby
          Ответить
        • как на чем? на J
          Ответить
          • Смотри, все изи

            + это обычный плюс, такой еще твои мамка и папка юзали в школе когда маленькими были, ага

            2 + 3
            5

            Просто же. да? давай еще

            % - это поделить. Что значит почему? Ты долбоеб? Ты доблоеб?! % - лучшее поделить чем /!! Не спорь о чем не знаешь

            2 % 4
            2

            Просто как дваждыдва наоборот

            % 4
            0.25

            Видал!. Видал! С разным числом аргументов функция работает по разному! это тебе не сишка-хуишка! Тут серьезные технологии!

            % 1 2 3 4
            1 0.5 0.333333 0.25

            Даже форыч вшит в подкорку!

            2 % 1 2 3 4
            2 1 0.666667 0.5
            2 4 3 2 % 1 2 3 4
            2 2 1 0.5

            И так можно. смотри как клево! охуительно!

            А теперь смотри - что такое среднее арифметическое вектора? это... ну...ну... блеать, чему тебя учили в школе? Это сумма деленная на количество, правильно? Ай, все равно долбоеб!

            записываем
            +/ - сумма да, да именно суда сбежало поделить

            +/ 1 2 3 4
            10

            # - шарп длинннннннннна

            # 1 2 3 4
            4

            а поделить мы знаем

            присвоение как в паскале. вывернутом кишками на солнце

            avg =: хуе-мое

            А теперь пишем вместе
            среднее арифметическое (avg) это (=:) сумма(+/) деленная(%) на количество(#)

            avg =: +/%#

            avg =: +/%#
            avg 1 2 3 4
            2.5

            а отклонение (deviation)это(=:) сам элемент (]) минус (-) сумма(+/) деленная(%) на количество(#)

            deviation =: ]-+/%#
            deviation 1 2 3 4
            _1.5 _0.5 0.5 1.5

            А еще ] можно не писать, если она первая слева

            deviation =: -+/%#
            deviation 1 2 3 4
            _1.5 _0.5 0.5 1.5

            Вот это язык. вот это возможности!
            Ответить
            • Охуеть, пиши учебники!
              Ответить
              • "J для долбоебов. Издание 2ое, дополненное пиздюлями"
                Ответить
                • Язык, который делает из программиста долбоеба. Специально для /pr/
                  Ответить
                  • Тебе стоит пройти этот курс
                    Ответить
                    • Курс рукоделия - изготовления троллейбуса из хлеба?
                      Ответить
                      • kegdan в http://govnokod.ru/19896#comment324133 написал:
                        >> "J для долбоебов. Издание 2ое, дополненное пиздюлями"
                        Ответить
                        • В смысле что его изучать могут только долбоебы?
                          Ответить
                          • Нет, Марррио! Какой же ты тупой, Марррио!
                            Ответить
                • =======================================
                   Язык программирования J для долбоёбов. 
                     Издание 2ое, дополненное пиздюлями
                  +++++++++++++++++++++++++++++++++++++++
                  ОБУЧИМ ФУНКЦИОНАЛЬНОМУ ПРОГРАММИРОВАНИЮ
                   ТАДЖИКОВ, УЗБЕКОВ, КИРГИЗОВ, КАЗАХОВ,
                     ТУРКМЕНОВ, КАВКАЗЦЕВ, ПРИБАЛТОВ, 
                      ДЕТЕЙ ИЗ НЕБЛАГОПОЛУЧНЫХ СЕМЕЙ
                  ---------------------------------------
                  Специально для участников «Евромайдана»
                    издание дополнено курсом арифметики
                       по программе начальной школы
                  +++++++++++++++++++++++++++++++++++++++
                   ВСЁ, ЧТО ВЫ ХОТЕЛИ УЗНАТЬ ПРО ЯЗЫК J,
                           НО БОЯЛИСЬ СПРОСИТЬ
                  =======================================
                  Ответить
                  • Отзывы
                    Мы на таком не пишем - разработчик из Юбисофт
                    Эта книга с хуем! - Никита Джигурда
                    Хуета какая-то - журнал "Игромания"
                    Москоляку на гиляку! - какой-то хохол
                    Ответить
                  • >>ПРИБАЛТОВ
                    блядь, это ты расскажи тем, кто делал Skype или MikroTik.
                    Шовинист хуив
                    Ответить
                    • Skype — ненужный мессенджер с дырами в безопасности, занимающий всю оперативку и все ресурсы процессора, сменивший нескольких хозяев.

                      MictoTik — какой-то производитель маршрутизаторов, известный в Буркина-Фасо.

                      При чём тут они?
                      Ответить
                      • >>Skype — ненужный мессенджер
                        Один из первых голосовых мессенджеров, бывший долгое время стандартом де-факто для звонков по Интернету, купленных Microsoft.

                        >>MictoTik — какой-то производитель маршрутизаторов,
                        Маршрутизаторов и собственной операционки к ним, известный каждому телекоммуникационщику по всему миру (в гугл "mikrotik vs cisco"). Ты просто не в теме.

                        >>при чём

                        Skype: " in cooperation with Ahti Heinla, Priit Kasesalu, and Jaan Tallinn, Estonians who developed the backend that was also used in the music-sharing application Kazaa."

                        MikroTik: Mikrotīkls SIA, known internationally as MikroTik, is a Latvian manufacturer of computer networking equipment
                        Ответить
                        • Принято. Ну вот, значит, в Прибалтике программирование востребовано и книжка не помешает.

                          Про Литву надо ещё что-нибудь вспомнить. Помню только что во времена проклятой советской оккупации в Литве собирали БК-0010.
                          Ответить
                        • > "mikrotik vs cisco"
                          > Ты просто не в теме.

                          А ты в теме? Расскажи, пожалуйста, оно и правда "воткнул-настроил-забыл" или нужно дрочить много мануалов, чтобы заработали хотя бы базовые возможности?
                          Ответить
                          • да там практически такой же интерфейс, как в ios (не путать ios с ios)
                            воткнул, настроил, забыл
                            Ответить
                            • > не путать ios с ios
                              Кажется, я перепутал...
                              Ответить
                          • Там есть внятный визард для дефолтных настроек, но дрочить мануал в целом полезное занятие, особенно если твоя конфигурация чуть сложнее, чем выпустить в Инет через провайдера домашний комп.


                            Как минимум сразу советую:
                            1. Отключить WebFIG и Winbox сервисы
                            2. Включить ssh по ключу
                            3. Открыть порт на ssh только со своего IP (ну или только из домашней локалки в случае домашнего роутера)
                            4. Явно разрешить input established, related, icmp ping и ntp плюс доступ из локалки. Остальное input DROP
                            5. Тоже самое с forward.
                            6. Сделать бекап конфигурации и схронить в укромном месте
                            7. Настроить NTP клиента
                            Ответить
                            • 3a. Поднять ssh на нестандартном номере порта. Сразу отсеется куча ботов.
                              Ответить
                              • Верно. Если совсем усраться, то можно еще сделать knocking. Знаешь port port knocking?
                                Ответить
                                • Знаю. Нужно стукнуть (уложившись в таймаут) в определённом порядке, например, в три номера порта, известные только посвящённым. Например, постучать в порт 14, потом в порт 88, потом в порт 666, тогда тебе откроют.
                                  Ответить
                      • да лан, микротик вполне неплох для мелких задач, когда хочется сэкономить по максимуму
                        Ответить
            • А что выведет
              2 4 3 2 % 2 3 4
              ?
              Ответить
              • length error
                Ответить
                • Почему
                  делить 0 элементов на 4 элемента можно,
                  делить 1 элемент на 4 элемента можно,
                  делить 4 элемента на 4 элемента можно,
                  делить 2 элемента на 4 элемента нельзя?
                  Ответить
                  • Потому что 0 элементов - это унарное представление. % в унарном представлении возвращает обратное к числу.

                    1 элемент расценивается как скаляр и производится операция скаляр к вектору, что имеет место быть

                    4 расценивается как вектор, а для векторов равной длинный определённо почленное применение операций.

                    А 2 это вектор отличной длины, увы. Можно растянуть его с помощью 4&$

                    4&$ 1 2
                    1 2 1 2
                    Ответить
                    • То есть это разные по семантике операторы на самом деле? А если длина вектора определяется в рантайме, то как определяется, какой оператор вызвать? Тоже в рантайме, с кидком исключения?

                      Сколько будет
                      5 &$ 1 2 3
                      ?
                      Ответить
                      • да

                        5 &$ 1 2 3

                        1 2 3 1 2
                        Ответить
                      • 3 4 5 $ 1 2 3 4

                        1 2 3 4 1
                        2 3 4 1 2
                        3 4 1 2 3
                        4 1 2 3 4

                        1 2 3 4 1
                        2 3 4 1 2
                        3 4 1 2 3
                        4 1 2 3 4

                        1 2 3 4 1
                        2 3 4 1 2
                        3 4 1 2 3
                        4 1 2 3 4
                        Ответить
            • > deviation =: ]-+/%#

              А почему не элемент минус сумма, и всё это вместе делённое на количество?
              Ответить
              • j всегда групперует справа налево


                deviation =: ]-+/%#

                эквивалентно

                deviation =: ]-(+/%#)
                Ответить
            • Это лучшая дока в интернете, которую можно найти по J
              Ответить
    • А вообще там при касте боксинг/анбоксинг происходит со всеми вытекающими. Так что эта...
      Ответить
      • Нормальный вызов s.Change(2):
        ldloca.s   V_0
        ldc.i4.2
        call       instance void ConsoleApplication13.Program/MyStruct::Change(int32)


        Каст в интерфейс ((IChangable)s).Change(3):
        ldloc.0
        box        ConsoleApplication13.Program/MyStruct
        ldc.i4.3
        callvirt   instance void ConsoleApplication13.Program/IChangable::Change(int32)


        Такой же box вызывается перед WriteLine.

        И, наконец, самое страшное — последний фрагмент с кастами туда-сюда:
        ldloc.0
        box        ConsoleApplication13.Program/MyStruct
        stloc.1
        ldloc.1
        unbox.any  ConsoleApplication13.Program/MyStruct
        stloc.2
        ldloca.s   V_2
        ldc.i4.4
        call       instance void ConsoleApplication13.Program/MyStruct::Change(int32)


        Я вообще не знаю .NET. Что делают эти box/unbox и что из этого вытекает?
        Ответить
        • > Что делают эти box/unbox и что из этого вытекает?
          Боксинг - это когда value type кастится в object. При этом создаётся копия в куче и с ней уже проводятся дальнейшие операции. При анбоксе тоже создаётся копия, но уже на стеке. Анбокс - это когда из object достаётся value type.
          Ответить
        • А суть такова:

          Структура в шарпе всегда хранится на стеке (даже когда создается через new, да), а интерфейсы стандартных функций требуют объекты, которые могут лежать только в куче. Поэтому в шарпе существуют неявные операции упаковки в обьект и распоковки из него.
          А теперь по коду.
          Console.WriteLine(); не знает как работать с твоей собственной структурой и будет требовать обьект, что вызовет упаковку в обьект с копирование в кучу. Если написать

          Console.WriteLine(s.ToString());


          То никакой упаковки не будет. Будьте внимательны с этим, ребята, ибо код

          Console.WriteLine(s+s+s+s+s);


          Упакует s в пять разных (!) обьектов, и передаст их на вход String.Concat или как-то так

          ((IChangable)s).Change(3);


          Приведение к интерфейсу всегда создает обьект в куче. по сути(IChangable)s создает совершенно независимый от s обьект в куче, копирует его поля, выполняет Change(3), а потом он сразу попадает под интерес сборщика мусора, потому что на него нет ссылок.

          var o = (IChangable) s;
          ((MyStruct) o).Change(4);


          Тут мы упаковывает s в обьект о, который хранится в куче, а затем с помощью

          (MyStruct) o

          распаковываем его. Суть в том, что распаковка без копирования в шарпе абсолютно бесполезна. Мы создаем обьект на стеке, на которы у нас нет ссылки, и изменяет его с помощью .Change(4). На запакованный в o обьект это никак не влияет

          Кстати

          var o = (object)s;
          ((IChangable)o).Change(4);
          Console.WriteLine(o);


          отработает нормально и выведет в консоль 4

          Цитата Рихтера

          "Некоторые главы этой книги я показал разработчикам . Познакомившись с примерами
          программ (например, из этого раздела), они сказали, что решили держаться подаль-
          ше от значимых типов . Должен сказать, что эти незначительные нюансы значимых
          типов стоили мне многодневной отладки, поэтому я и описываю их в этой книге ."
          Ответить
          • > на стеке
            Даже когда лежит как поле нормального объекта? :3
            Ответить
          • >начимых типов .
            Это перевод термина value type?
            Ответить
        • >то делают эти box/unbox и что из этого вытекает?

          Боксинг это перемешение питуха в кучу и работа с ним по референсу.
          Анбкосинг это обртная операция
          Ответить
    • Неужели никто не проверил?
      http://ideone.com/4sMlMx
      Ответить
    • Поэтому в жабке Value Types будут иммутабельными, когда сделают. Лет через 10, может быть
      Ответить
    • var s = new MyStruct(1);

      Console.WriteLine(s);

      s.Change(2);

      Console.WriteLine(s);

      IChangable s1 = (IChangable)s;
      s1.Change(3);

      Console.WriteLine(s1);

      var o = (MyStruct)s;

      o.Change(4);

      Console.WriteLine(o);
      Ответить
    • https://blog.foolsoft.ru/c-otlichie-klassa-ot-struktury-class-vs-struct/
      Ответить
      • >Однако данный ответ врятли внесет какую то ясность людям, которые не понимают что значит передавать по ссылке или передавать по значению.

        Вот именно по-этому я за то, что бы учить студентов няшной.
        Ответить
    • До чего же приятно, что этот томский долбоёб-налобин больше тут не появляется.
      Ответить

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