Все новые функции C# 13 | Что нового в .NET 10, почему нет .NET 9

8a4ba9fece64df495770fc9a5bcd1300.png

Я являюсь студентом по обмену из российского ГМИГ имени Трофима Лысенко (Главный Мурманский Институт Генетики). Учился на инженера-программиста и пол года назад был отправлен в Америку в качестве студента по обмену. Это у меня получилось благодаря двойному гражданству (я гражданин Ирана и России).

К нам на лекцию пришел один из разработчиков Microsoft и рассказал про .NET 10, подробнее в самом низу статьи под спойлером.

.NET 10 или как его теперь начнут называть .NET X — это новая версия .NET, которая выйдет уже в 2024 году. Большая часть этой статьи посвящена именно новым возможностям C# 13.

Почему .NET 10 и где .NET 9?

«У нас так принято.» — Дословный перевод. Больше комментариев разработчик не дал.

Упрощение создание экземпляров класса

Не буду тянуть время и сразу покажу самое лучшее нововведение. Допустим у нас есть класс Person и нам надо создать его экземпляр.

public class Person
{
  public string Name {get; set;}
  public int Age {get; set;}
  public Person(string name, int age)
  {
    Name = name;
    Age = age;
  }
}

Раньше у нас было всего 3 способа создание класса.

Person man1 = new Person("Mike", 32);
var man2 = new Person("Mike", 32);
Perosn man3 = new("Mike", 32);

Новая версия C# позволяет комбинировать var и new (). Это легко читается и экономит место.

var man1 = new("Mike", 32);

Новые инкременты

Были добавлены аналоги инкремента для деления и умножения.
i++ эквивалентно i = i + 1
i// эквивалентно i = i / 1
i** эквивалентно i = i * 1

int a = 3;
Console.WriteLine(a**); //3
Console.WriteLine(a//); //3

Этот код эквивалентен прошлому примеру:

int a = 3;
a = a * 1;
Console.WriteLine(a); //3
a = a / 1;
Console.WriteLine(a); //3

Из минусов т.к. оператор инкремента деления аналогичен началу комментария, то символ начала комментария будет изменен на свою экранированную версию.

int a = 10;
int b = a // "some comment"
\/\/ CS0019 Оператор "//" не может применяться к операнду типа "Int32" и "String"
\/\/ Look, I'm comment!

Улучшение синтаксиса интерполирования строк

Теперь можно создать интерполированную строку не только при помощи знака $, но и €.

string name = "Michael";

string a = €"Hello, {name}!";
string b = $"Hello, {name}!";

Console.WriteLine(a == b); \/\/ True

В версии .NET XI (.NET 11) обещают также ввести поддержку символа £.

Создание экземпляров абстрактных классов

Эта возможность уже была на была в версиях .NET Core 3.1 и .NET 5.0, но позже ее удалили. Как было раньше:

public abstract class AbstractShape
{
  public AbstractShape() { }
  
  public void Print()
  {
    Console.WriteLine("I have no area");
  }
}

class Program
{
  static void Main(string[] args)
  {
    Type AbstractShapeType = typeof(AbstractShape);
    ConstructorInfo magicConstructor = AbstractShapeType.GetConstructor(Type.EmptyTypes);//get Constructor

    Type TypeRuntimeMethodHandle = typeof(RuntimeMethodHandle);MethodInfo magicMethod = TypeRuntimeMethodHandle.GetMethod("InvokeMethod", BindingFlags.Static | BindingFlags.NonPublic);//get InvokeMethod from RunTimeMethodHandle

    PropertyInfo sigInfo = magicConstructor.GetType().GetProperty("Signature", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance);//get signatureAbstractShape shape = (AbstractShape)magicMethod.Invoke(null, new object[] { null, null, sigInfo.GetValue(magicConstructor), true, null });

    shape.Print(); // I have no area
    Console.ReadLine();
    
  }
}

В .NET X эта возможность снова вернется и синтаксис будет облегчен при помощи ключевого слова, о котором я расскажу дальше.

Ключевое слово unsaviest

Это ключевое слово включает в себя все возможности unsafe, а также добавляет несколько интересных возможностей. Вот так например можно создать экземпляр абстрактного класса:

unsaviest
{
  AbstractShape shape = new AbstractShape();
  \/\/ Или воспользумся облегченным созданием экземпляров
  var shape2 = new();
}

Отрицание сравнения

Теперь операнд ! можно применить к операндам сравнения.

Console.WriteLine(3 > 5); \/\/ False
Console.WriteLine(3 !> 5); \/\/ True

Console.WriteLine(5 >= 5); \/\/ True
Console.WriteLine(5 !>= 5); \/\/ False

Readonly constant

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

public class MyMath
{
  public readonly const double PI = 3.14;
}

public class Program
{
  static void Main()
  {
    var math = new()
    Console.WriteLine(math.PI); \/\/ 3.14
    Console.WriteLine(MyMath.PI); \/\/ Error
    }
}

На самом деле код класса на этапе компиляции превращается в:

public class MyMath
{
  private const double __value_PI = 3.14;
  public double PI
  {
    get
    {
      return __value_PI;
    }
  }
}

Мое личное мнение, что readonly const это излишний синтаксический сахар, хотя может кому-то и понравится.

Заключение

Интервью

К нам на лекцию пришел один из разработчиков Microsoft «Джеймс Хейлсберг» и рассказал про устройство .NET. Под конец лекции он вскользь упомянул про .NET 10. После лекции я подошел к нему с вопросами и слово за слово он согласился на интервью. В этой статье я привел выжимку и перевод 23 минутного интервью, которое я выложил на YouTube.

Оно на английском, но я добавил субтитры
https://www.youtube.com/watch? v=dQw4w9WgXcQ

Спасибо за прочтенье, всех с днем математика.

© Habrahabr.ru