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

    +108

    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
    class Matrix
    {
        double[,] matrix;
        int rows, columns;
    
        // Не вызывается до закрытия приложения
        ~Matrix()
        {
            Console.WriteLine("Finalize");
        }
    
        public Matrix(int sizeA, int sizeB)
        {
            rows = sizeA;
            columns = sizeB;
            matrix = new double[sizeA, sizeB];
        }
    
        // Индексатор для установки/получения элементов внутреннего массива
        public double this[int i, int j]
        {
            set { matrix[i,j] = value; }
            get { return matrix[i,j]; }
        }
    
        // Возвращает число строк в матрице
        public int Rows
        {
            get { return rows; }
        }
    
        // Возвращает число столбцов в матрице
        public int Columns
        {
            get { return rows; }
        }
    
    }

    Нашёл в статье из MSDN'а

    Запостил: FMB, 10 Июля 2010

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

    • эм.... и что?
      Ответить
      • // Возвращает число столбцов в матрице
        Ответить
    • Ну финализтор отстойный. Ну неоптимально. Ну не все необходимые функции и операторы реализованы для матриц. Ну язык не самый подходящий для решения задач, использующих матрицы. Ну число столбцов возвращается не верно. И всё. В чём говнокод? Просто учебный пример.
      Ответить
      • > Ну язык не самый подходящий для решения задач, использующих матрицы.

        Обоснуй.
        Ответить
        • Fortran
          Ответить
          • И что же есть в фортране, что нет в C#?
            Ответить
            • Вопрос интересный. Нет встроенного типа данных Complex.
              Ответить
              • А зачем он нужен "встроенный"?
                Ответить
                • Чтобы писать красивый код без перегрузки операторов.
                  Просто Complex — это первое, что приходит в голову, когда надо найти отличие Фортрана от других языков.
                  Обидно, что кватернионов в Фортране нет...
                  Ответить
              • В 4.0 он таки появился...
                Ответить
      • Что значит "финализатор аццтойный"? явно же видно, что для учебных целей... ЗЫ: где-то на codeproject валялся давольно мощный класс Matrix
        Ответить
        • Ну хочется автору лишний раз употребить "умное слово" типа финализатор.
          Ответить
        • Вполне возможно, что он лишь для отладки. Дак вот если для этого, то нет никаких данных о том, какой объект убивается.
          Ответить
          • учебный пример, который показывает как работают классы, скорее всего там был всего лишь 1 класс;
            Ответить
      • Не отстойный а отстой. Финализатором не нужно пользоваться в платформах с GC (типа jvm или clr/.net).

        Почти никогда не нужно.
        Ответить
        • Системные ресурсы удалять за тебя кто будет? Страуструп?

          В clr/.net дохрена с этим мороки.
          Ответить
          • Финализатор может вызваться через 4 года. А может вообще не вызваться.

            Расчитывать на удаление им ресурсов -- глупо и наивно
            Ответить
            • Но конечной пользователь класса может в каком-то месте забыть вызвать Dispose, чтобы освободиться от системных ресурсов. Поэтому есть смысл подстраховаться и поставить доп. fool-proof Dispose в финализатор.

              > А может вообще не вызваться.

              В особых случаях типа нестабильности проги (креши, failfast-закрытие). При нормальном ходе программы на выходе запускаются все оставшиеся финализаторы (есть, правда, таймаут).
              Ответить
              • Для склерозматиков есть using() в дотнете.

                или инспекция "Нету вызова close в блоке finally для объекта класса, импементирующего close" в одном известном IDE для джавы)
                Ответить
                • Ну да, финализаторы бездумно скопипащены с явы. На уровне clr можно оставить, т.к. некоторые языки типа с++ требуют, но на уровне C#, соглашусь, избыточно. Так-то using появился ЕМНИМ не с первой версии -- и это чисто синтаксический сахар сугубо с#. Другие языки могут под clr его не иметь.

                  "есть using() в дотнете." -- бред.
                  "есть using() в сишарпе." -- ок.
                  Ответить
                • Вот напр. в System.IO.FileStream, как это делают в майкрософт:

                  ~FileStream()
                  {
                      if (this._handle != null)
                      {
                          this.Dispose(false);
                      }
                  }


                  Если класс вызван языком, где нет аналога using (функциональные? какой-то third-party-язык?), то юзер мог забыть проставить Dispose (или даже не знать о нём, потому что индус). clr - это мультиязыковая среда, не то что убогонькая java, нужно подстраиваться под всех.
                  Ответить
                  • джава тоже давно мультиязыковая: читать про jpython, jruby, groovy, scala итд
                    Ответить
                    • > джава тоже давно мультиязыковая

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

                      Я говорю про мультиязыковость изначальную, нативную.

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

                      В clr можно реализовать больше языком, чем в java. Напр., в java технически не реализовать C#.

                      Если язык работает с указателями -- опять же, java не пустит.

                      Если в языке есть хотя бы такая мелочь как unsigned числа - всё, java громко пердит и накрывается тазом.
                      Ответить
                      • >>Я говорю про мультиязыковость изначальную, нативную.
                        Что такое "нативная"? Вы опять термины не по назначению употребляете?

                        >>в жабе мультиязыковость прибита позднее, разнокалиберными гвоздами, скорее всё маркетологической болтовнёй.

                        Смешно слышать о "маркетологической болтовне" от адепта .NETа)

                        >>Напр., в java технически не реализовать C#.
                        да ну?:) А проект такой есть. Правда кому он нужен? Стараниями linq и extension methods си шарп стремительно превращается в говноязык по хлеще php, так что не думаю что этот проект кому-то нужен.

                        >>Если язык работает с указателями -- опять же, java не пустит.
                        Да, при наличии управляемой кучи это очень важно) Вы видели работу с указателями в .NET где нить, кроме PInvoke?
                        Так как PInvoke автоматически привязывает нас к платформе -- его в джаве и нет.

                        >>Если в языке есть хотя бы такая мелочь как unsigned числа -

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

                        Чего реально не хватает в джаве -- так это структур (хранящихся в стеке)
                        Ответить
                        • > Чего реально не хватает в джаве -- так это структур (хранящихся в стеке)
                          а зачем?
                          Ответить
                          • Что бы не срать в кучу ради передачи в один метод трех параметров
                            Ответить
                            • по задумке сана, это не должно вообще волновать прогера. поэтому кучи других подобных вещей тож нет
                              Ответить
                        • > Что такое "нативная"? Вы опять термины не по назначению употребляете?

                          посмотри, что значит native в англ. никогда выражения "native support" не слышал, дурашка неграмотная? То же, что и "out of box support".

                          > Смешно слышать о "маркетологической болтовне" от адепта .NETа)

                          Я не адепт .NET'а, я адепт mono, а там маркетология просто НУЛЕВАЯ.

                          > да ну?:) А проект такой есть.

                          Ну вот например в java-машине не просто так раеализовать структуры. Скорей всего в Grasshopper'е постоянно идёт clone(). Я не спорю, что на тюринг-полной машине можно реализовать что угодно, но это будут жуткие костыли + тормоза. Поэтому я и говорю, что clr изначально лучше для мультиязыковой поддержки.

                          > Вы видели работу с указателями в .NET где нить, кроме PInvoke?

                          Да, в классе String, например. Или аргументы out и ref.
                          Плюс, опять же, если указатели не нужны в C#, это не значит, что есть теоретически язык, которому они не понадобятся. clr - мультиязыковая среда, поэтому она предоставляет и указатели, т.к. какой-нибудь язык их может требовать.

                          > Так как PInvoke автоматически привязывает нас к платформе -- его в джаве и нет.

                          Работа с указателями никак не привязывает к платформе. Указатели это не PInvoke. Кстати, если ты не в курсе, то в clr два типа указателей: managed pointers и unmanaged pointers. Синтаксис в ilasm разные: int* и int&.
                          Так-то. Не то что в ограниченной жаба гыгы.

                          > Их можно сэмулировать.

                          Интересно, как? Да и тормозами. И костылями. И велосипедами.

                          Напр., в .NET есть официально поддерживаемый слой абстракции для динамических языков - DLR. Там есть определения для Tuple<>, Func<> и многое другое.
                          В яве же, чтобы реализовать язык, нужно всеё велосипедить вручную.
                          Плюс напр. два дингамических языка не смог нормально общаться друг с другом, потому что тупли у них разные, списки у них разные, и так далее.

                          Одно дело - сделать компилятор языка в java-байткод, другое деол - сделать так, чтобы байткод, написанный на разных языках, мог нормально друг с другом общаться.
                          Ответить
                        • > Чего реально не хватает в джаве -- так это структур (хранящихся в стеке)

                          Вот ты пиздел про PInvoke, а структукры в сишарпе чисто для PInvoke'а сделаны. Не быо бы PInvoke'а, их бы и не вставили.
                          Ответить
                        • > Так как PInvoke автоматически привязывает нас к платформе -- его в джаве и нет.

                          Кстати, здесь ты жёстко тупишь. Если вызываемая пинвоком либа сама по себе кроссплатформенная, то пинвок нас никуда не привязывает.

                          Напр. PInvoke к функциям GTK -- будет работать на всех процессорах, на всех ОСях.

                          А в жабе мы бы делали JNI-слой, и компилировали бы нативную glue-либу под каждую архитектуру, как мудни. Не это ли привязка к платформе? Если мы не сделали GTK-glue под ARM -- то всё, не пашет java-GTK под ARM. И так далее.

                          А в mono один раз написал - и радуйся.
                          Ответить

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