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

    −120

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

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

    Запостил: kegdan, 23 Марта 2017

    Комментарии (54) 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);

      Правда пока не ясно, не вырежут ли это, после того, как инженеров отпустит.
      Ответить
    • показать все, что скрыто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 вногострел, или возвращение блудного указателя

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

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

            практически подобие этого достигается только референсами - но они инвалидируются когда оригинальная переменная умирает. в С/С++ референс показывает в 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 шарпе уже были некоторые предпосылки к такому развитию событий. Функиональшины было не так много, но она была скрученна в язык так, что не вызывала блевотные позывы при использовании. и это хорошо - подумали дизайнеры языка, и обмазали шарпеев функиональщиной с ног до головы. Пока данные изменения вызывают исключительно положительные эмоции, а что будет дальше - покажет время.

      Всем сладких лямбд!
      Ответить
    • показать все, что скрытомного громких звуков, много матов и как всегда ниодного аргумента почему новые фичи это плохо
      Ответить
    • показать все, что скрытоЧеловек решил про программирование поговорить, а ты развыебывался как мудак. Не люблю таких программистов, говна тебе.
      Ответить
    • показать все, что скрытоа в соседней комнате сидел бекендщик на шестой джаве. Он услышал ваши слова,написал анонимный класс с указанием типов-параметров и заплакал
      Ответить
    • показать все, что скрытоКегги! Ты живой!
      Ответить
    • показать все, что скрыто# до sp1 никто на 2017 студию переходить не будет

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

      Профессор в отпуске, поэтому не сможет ознакомиться с Вашими пёрлами.
      Ответить
    • показать все, что скрыто> там... там... там ТАКОЕ!!
      "пацаны!.. пацаны!!.. у них даже лошадь есть!"
      Ответить

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