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

    −6

    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 один раз написал - и радуйся.
                          Ответить

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