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

К нам на конференцию приехал один из разработчиков из 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!

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

ЧИТАТЬ   Распродажа Bose ко Дню матери все еще продолжается, наряду с другими лучшими предложениями на наушники на этой неделе.

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

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 эта функциональность вернется, а синтаксис будет облегчен с помощью ключевого слова, о котором я расскажу далее.

наименее надежное ключевое слово

Это ключевое слово включает в себя всю функциональность 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

Константа только для чтения

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

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 — это ненужный синтаксический сахар, хотя некоторым это может понравиться.

ЧИТАТЬ   Отчет Verizon показывает, что атаки с компрометацией корпоративной электронной почты почти удвоились

Заключение

Интервью

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

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

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

Source

От admin