Я являюсь студентом по обмену из российского ГМИГ имени Трофима Лысенко (Главный Мурманский Институт Генетики). Учился на инженера-программиста и пол года назад был отправлен в Америку в качестве студента по обмену. Это у меня получилось благодаря двойному гражданству (я гражданин Ирана и России).
К нам на лекцию пришел один из разработчиков 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
Спасибо за прочтенье, всех с днем математика.