Я являюсь студентом по обмену из российского ГМИГ имени Трофима Лысенко (Главный Мурманский Институт Генетики). Учился на инженера-программиста и пол года назад был отправлен в Америку в качестве студента по обмену. Это у меня получилось благодаря двойному гражданству (я гражданин Ирана и России).
К нам на лекцию пришел один из разработчиков 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);
Person 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
Спасибо за прочтенье, всех с днем математика.
Комментарии (66)
Markscheider
00.00.0000 00:00+2Я прошу прощения, это первоапрельский пост? В поисковике не нашел ничего о "Главном Мурманском Институте Генетики", да и "имени Трофима Лысенко" сильно озадачило.
flygrounder
00.00.0000 00:00+23Были добавлены аналоги инкремента для деления и умножения.
i++
эквивалентноi = i + 1
i//
эквивалентноi = i / 1
i**
эквивалентноi = i * 1
Как будто бы на этом моменте всё должно стать понятно
Markscheider
00.00.0000 00:00+4Как будто бы на этом моменте всё должно стать понятно
Я досюда не дочитал, прифигел уже на первом абзаце :)
fire64
00.00.0000 00:00+9Я в начале думал все, приехали...
Потом вспомнил, про первое апреля и отпустило....
s207883
00.00.0000 00:00Не удивлюсь, если первый пункт мы взаправду скоро увидим. А так да, хорошая шутка.
Dmitry_Dor
00.00.0000 00:00+4это первоапрельский пост?… «имени Трофима Лысенко» сильно озадачило
В каждой шутке есть доля шутки ???? — habr.com/ru/post/725468 ????
/confused
AlexXYZ
00.00.0000 00:00+2Никто не обратил внимание на замену символов начала однострочного комментария??? :D
C первым апреля!!!
whoisking
00.00.0000 00:00+6Супер, понравились новые фишки C#, пожалуй, даже брошу свой петон ради них. Но больше всего зашла шутка про гражданство, на этом моменте я ещё думал что это просто совпадение)
lil_master
00.00.0000 00:00+6i//
эквивалентноi = i / 1
i**
эквивалентноi = i * 1
Вау, это гениально!
i00 эквивалентно i = i + 0; очень не хватает) добавьте ровно через год
d_ilyich
00.00.0000 00:00+7Надеюсь, через год добавят наконец возможность писать
if ( 1 <= x < 4 ) ... // и/или даже if ( x in [1, 4) ) ...
а то надоели уже эти лишние символы
if ( 1 <= x && x < 4 )
:)
Magnetiq
00.00.0000 00:00+5Если честно - эта пять! ???? Как водится, проскользил взглядом вступление (бла-бла, давайте к телу), на серьезных шах кивнул на "У нас так принято". На первом же 'нововведении' с классами решил что опечатка, полез в комменты, ну и немного подпортил себе сюрприз... ????
Markscheider
00.00.0000 00:00+1Как водится, проскользил взглядом вступление (бла-бла, давайте к телу)
Сколько людей - столько мнений. Я не погроммист, поэтому содержательную часть не смог оценить критически. А вот на вступление как раз триггернулся :)
St_Rus
00.00.0000 00:00var man1 = new("Mike", 32);
вот тут не пойму: а как там понимается, что это именно тот самый объект, не какой-то другой?! что это, к примеру, Person, а не Car? ну а вообще, очень даже классно, сильно ускоряет работу
0xd34df00d
00.00.0000 00:00Вполне могут быть системы типов, где это на самом деле не проблема. Конкретный тип выведется дальше по контексту, либо, с row polymorphism, даже это не нужно — достаточно полиморфизма по полям.
rootdefault
00.00.0000 00:00+7Забыл что сегодня первое апреля, по 5 раз перечитывал новый синтаксис, думал всё, доработался к вечеру…
MichaelSkirda Автор
00.00.0000 00:00+2Кстати, про создание экземпляров абстрактных классов в .NET 5 и .NET Core 3.1 это не шутка, через reflection их можно было создать.
usego
00.00.0000 00:00+4Блин. Вот каждый раз даю себе слово, что на первое апреля не разведут, и на тебе. На полном серьёзе пытался осознать, как вот это var man1 = new("Mike", 32); может работать на уровне компилятора.
Myxach
00.00.0000 00:00Допустим в лоб - перебрать все классы, которые не скрыты namespace'ом. Правда это будет работать только для уникальных наборов аргуменов и фиг знает сколько времени надо
kaatula
00.00.0000 00:00+4Спасибо, купился)
Дошло только на знаке €
Ждём .NET 30, или, как его начнут называть...
zfima
00.00.0000 00:00+2Я гражданин Ирана, Израиля и Народной Республики Майя и у меня вопрос: почему в новой версии .NET XI не разрешили делить объект на 0? Например, на COBOL мы так всегда делаем.
donRumatta
00.00.0000 00:00Просто топовый пост, до евро еще верил, но копил вопросы для комментов(= Очень жаль, что сюда зашли и порадовались только шарперы, может заголовок бы более общий(=
gotoxy
Наконец-то!
Про private virtual инфы нет?
Vest
Можно еще сократить, убрав new, а потом и var. И так понято будет, type inference поможет.
ildarin
Убрать var и new как раз таки можно, оставив только название класса. Смысла в этих словах все равно нет.
Тут я развил идею
https://www.codeproject.com/Articles/5353397/QW-Quick-Write-The-Most-Succinct-Programming-Lang
vlivyur
We're sorry, but the article you are trying to view was deleted at 2 Mar 2023
ildarin
https://www.reddit.com/r/qw_language/comments/114swqo/qw_quick_write_the_most_succinct_programming/
ildarin
https://blog-ildarin.blogspot.com/2023/02/qw-quick-write-most-succinct.html?m=1
devlev
Ура, круто!
mikle305
и в чем интересно польза? сократили 1 слово взамен на явность типа при чтении?
UMenyaNeudobnieVoprosiki
rm
NoofSaeidh
Вообще private virtual вполне себе полезный кейс. Несколько раз натыкался когда он очень подходил, если бы был.
Это бывает нужно в классе в котором наследник объявляен как nested class и метод не хочется открывать на публику, но при этом надо в этом наследнике переопределить.
Воркэраунд - private protected virtual, но с тем же успехом можно сказать - зачем private, делай все internal.