Си диез / Говнокод #22662 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
Собственно сижу я на работе, никого не трогаю, а тут в чат скайпа заваливается запыхавшийся бекэендер и говорит
- там... там... там ТАКОЕ!!
Все напряглись
- Какое?
- Там... Там 7 шарп завезли.
Пришлось успокоить парня, сказать, что до sp1 никто на 2017 студию переходить не будет, да и вообще, мы тут таких как вы не любим. 
Но, любопытство гложило меня, почему я решил сам ознакомиться с мнимым великолепием надвмгающегося апдейта и спешу поделится 
с вами - а чего же там такого собственно завезли

Посвящается Стретору, который требовал от меня статью

Запостил: kegdan kegdan, (Updated )

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

  • 1 out - хуяут

    Раньше, что бы просунуть аут переменну в функцию нужно было ее придварительно создать, теперь же можно сувать сразу.
    Но, так как ими почти никто не пользуется, всем похуй

    2 Труплы

    В майкрософт наконеч-то скачал GHC, после чего инженеры начали отчаянно пиздить идеи из функциональщины. Внезапно
    оказалось, что tuple.new(хуй, пизда, джигурда) не лучший интерфейс для труплов, после чего было решено отбросить все до
    первой скобки. Туда им и дорога

    Зато теперь можно писать такое

    (var x, var y) = dosmth();


    3 Разламайка

    Теперь мы можем прописать классу деконструктор (не путайте с деструктором, такого в шарп все еще не завезли).

    код, вместо тысячи слов

    class Point
    {
        public int X { get; }
        public int Y { get; }
    
        public Point(int x, int y) { X = x; Y = y; }
        public void Deconstruct(out int x, out int y) { x = X; y = Y; }
    }


    (var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);

    Правда пока не ясно, не вырежут ли это, после того, как инженеров отпустит.
    Ответить
    • > (var x, var y) = dosmth();

      хаскель? больше на перл похоже.

      > (var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);

      так это же точно перл. только у нас на динамике все без дегенератовконструктов: `return wantarray ? ($x, $y) : ($this)`
      Ответить
    • Т.е. первым пунктом сделали out-аргументы удобнее, а вторым ненужными.
      Ответить
    • Нет, не вырежут. Декомпозиция/деконструкция это ж чуть ли не главный тренд последних лет
      Ответить
    • (var x, var y) = dosmth(); в луа такое сплошь и рядом. Теперь понятно, откуда ноги растут.
      Ответить
  • 4 Паттерн матчинг

    Да, твои глаза не врут! Паттерн матчинг в твоем любимом шарпике

    Теперь можно писать

    if( a is (int i, string s)) {...}

    и прочий невменяичь. Хаскеллисты в восторге

    5 Ассасин-свитч

    Ни что не истина и все дозволено

    Помните те времена, когда в свитч можно было положить только константы времени компиляции? забудьте!

    switch(shape)
    {
        case Circle c:
            WriteLine($"circle with radius {c.Radius}");
            break;
        case Rectangle s when (s.Length == s.Height):
            WriteLine($"{s.Length} x {s.Height} square");
            break;
        case Rectangle r:
            WriteLine($"{r.Length} x {r.Height} rectangle");
            break;
        default:
            WriteLine("<unknown shape>");
            break;
        case null:
            throw new ArgumentNullException(nameof(shape));
    }


    6 Xzibitционизм

    Эй, бро, я слышал ты любишь методы, поэтому мы положили методы тебе в методы, что бы ты мог вызывать метод во время вызова
    метода!

    Что тут еще скажешь?
    Ответить
    • > 5 Ассасин-свитч

      ты наверное не просёк фичу: это свитч по типу/классу, а не по значению.

      в крестах видел народ пытался такое делать - вроде никуда не пошло (IIRC здесь на ГК как-то раз пробегало).

      это ценная фича для тех кому она нужна.
      Ответить
  • 7 Би - это хорошо

    Теперь в числовые литералы можно засовывать _

    int i = 1_435_125;


    А если лень кастовать из бинарной в десятичную, то свпециально для тебя в шарп завезли бинарные литералы

    int i = 0b0101_1001_1100;


    8 вногострел, или возвращение блудного указателя

    Теперь можно возвращать не значение элемента массива, а ссылку на него

    public ref int Find(int number, int[] numbers)
    {
        for (int i = 0; i < numbers.Length; i++)
        {
            if (numbers[i] == number) 
            {
                return ref numbers[i]; // return the storage location, not the value
            }
        }
        throw new IndexOutOfRangeException($"{nameof(number)} not found");
    }
    
    int[] array = { 1, 15, -39, 0, 7, 14, -12 };
    ref int place = ref Find(7, array); // aliases 7's place in the array
    place = 9; // replaces 7 with 9 in the array
    WriteLine(array[4]); // prints 9

    9 набор юнного лучника

    А вам понравились проперти с функциональными стрелочками для обявление геттера? Хотите еще? их есть у меня!

    class Person
    {
        public string Name { get; }
        public Person(string name) => Name = name ?? throw new ArgumentNullException(name);
        public string GetFirstName()
        {
            var parts = Name.Split(" ");
            return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!");
        }
        public string GetLastName() => throw new NotImplementedException();
    }
    Ответить
    • > 1_435_125;

      опять блин перл. (хотя ларри волл признавался что он это из ады передрал.)

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

      > ??

      опять перл. только оригинальный синтакс это `||` или `or` или новый `//`
      Ответить
    • > 8 вногострел, или возвращение блудного указателя

      к слову тоже из перла. но только синтакс там извратный - с рефами/глобами надо извращатся, что бы сделать алиас на значение внутри массива/хэша. потому что переменная это просто "указатель" на значение, а массив это массив значений. и ничего не мешает к одному из значений массива еще одну переменную приклеить.

      или еще более древняя отсылка - если не ошибаюсь - лисп: там тоже переменная и значение это две разные вещи, и ими можно тоже извращатся.
      Ответить
        • ты в С/С++ не может сделать так что бы две разные переменные одного и того же типа ссылались на то же самое значение.

          практически подобие этого достигается только референсами - но они инвалидируются когда оригинальная переменная умирает. в С/С++ референс показывает в UB, в перле/лиспе значение продолжает жить, пока на него что-то ссылается.
          Ответить
          • > Теперь можно возвращать не значение элемента массива, а ссылку на него

            Причём здесь "переменные", зачем ты их придумал? Код в примере ссылается на ту память, которую ему передали, а не какую-нибудь там переменную на стеке. Вот аналогичный пример из C++
            int& find(int what, std::vector<int>& where) {
              for (auto& x : where) { if (x == what) return x; }
              throw std::out_of_range("Can't return a reference to non-existing element");
            }

            Возвращать ссылки на локальные переменные точно также нельзя, как и в плюсах:
            There are some restrictions to ensure that this is safe:

            You can only return refs that are “safe to return”: Ones that were passed to you, and ones that point into fields in objects.
            Ref locals are initialized to a certain storage location, and cannot be mutated to point to another.

            -- https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
            Ответить
            • Я тоже не понял гду тут ногострел

              Кигги, видимо, думает что мпссив передается по знчению и живет в стеке

              Но в нете массив живет в куче, а теье просто дали на него ссылку
              Ответить
              • А раньше .NET перевадал ссыль на элемент массива через структуру TypedReference и юзали скрытые MSIL __makeref
                __reftype
                __refvalue
                А сейчас видимо тупо довели синтаксис до ума.

                а имплементация все равно через .опу
                Ответить
  • Итоги

    Это уже не шарп, нахуй, это хаскель, блядь! - крикнет кто-нибудь и будет относительно прав. В 6 шарпе уже были некоторые предпосылки к такому развитию событий. Функиональшины было не так много, но она была скрученна в язык так, что не вызывала блевотные позывы при использовании. и это хорошо - подумали дизайнеры языка, и обмазали шарпеев функиональщиной с ног до головы. Пока данные изменения вызывают исключительно положительные эмоции, а что будет дальше - покажет время.

    Всем сладких лямбд!
    Ответить
    • Хуяскел. Все это чистой воды синтаксис шугар не более того. Кроме референсов.
      Ответить
    • > это хаскель, блядь!

      во первых - перл. во вторых - я уверен что паттерн матчинг в шарее будет лучше чем в хацкеле работать.
      Ответить
  • много громких звуков, много матов и как всегда ниодного аргумента почему новые фичи это плохо
    Ответить
    • вещи нужные т.к. уменьшают ненужные теледвижения, но сказать что это прорыв в C# который требует новой версии я бы не сказал.
      Ответить
      • То ли дело Фортран-66, в котором не было этих дурацких блочных конструкций. Всё равно же компилятор всё заменяет на goto (джампы).
        Ответить
  • Человек решил про программирование поговорить, а ты развыебывался как мудак. Не люблю таких программистов, говна тебе.
    Ответить
  • а в соседней комнате сидел бекендщик на шестой джаве. Он услышал ваши слова,написал анонимный класс с указанием типов-параметров и заплакал
    Ответить
    • Повезло, что в соседней комнате. Мог бы слушать разговор у себя над ухом в опенспейсе.

      // Пишу из опенспейса о наболевшем.
      Ответить
    • > на шестой джаве
      Повезло ему, могла ведь и пятая достаться.
      Ответить
        • > четвёртая
          Это где нормальную модель памяти ещё не завезли?
          Ответить
          • Да, ещё там не было дженериков, аннотаций, енумов, for-each циклов, varargs и автобоксинга.
            Ответить
              • Теперь ясно, куда борманд уходил.

                Ну и как тебе NieR: Automata
                Ответить
                • > ясно
                  Она ж где-то 10 дней назад всего вышла... Нестыковочка. Или ты про рай для оплаты за строки?
                  Ответить
                  • вдруг тебе как элитному анимешнику раньше выслали и ты уже 3 раза прошел
                    Ответить
                      • ну ты и нуб. до моих четырех сотен тебе еще расти и расти опускаться и опускаться.
                        Ответить
                • > как тебе
                  10 тленов и безысходностей из 10.

                  This cannot continue.
                  Ответить
  • # до sp1 никто на 2017 студию переходить не будет

    Ты не поверишь, но уже большинство тем, кто о неё знает, перешли.
    Ответить
  • >gосвящается Стретору,

    Профессор в отпуске, поэтому не сможет ознакомиться с Вашими пёрлами.
    Ответить
          • Твое желание исполнилось. На ближнем востоке - кровькишки, украина похожа на говно, которое разворочали веткой, а в россии Путин.

            Интересно, жив ли еще дефекате?
            Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8