Целевая типизация — это термин, используемый, когда выражение получает свой тип из контекста, в котором оно используется. В C# 9.0 некоторые выражения, которые ранее не имели целевого типа, теперь могут руководствоваться своим контекстом.[Добро пожаловать в C# 9.0 | Блог .NET (microsoft.com)]
Все мы знаем, что когда мы хотим создать новый объект, нам нужно использовать ключевое слово «новое» плюс указание целевого типа, как показано ниже:
User objUser = new User();
этот синтаксис в порядке, но здесь есть простой вопрос. Я уже объявил, что собираюсь создать объект типа User
, сказав: User objUser
`, так зачем мне снова использовать new User()
`?
В этой ситуации, когда целевой тип известен, мы можем переписать код, как показано ниже:
User objUser = new();
Теперь у нас есть целевое типизированное «новое» выражение! Обратите внимание, что целевой ввод «нового» выражения работает только тогда, когда мы явно указываем тип, очевидно, когда мы используем var
` для создания объекта, целевой ввод не имеет значения. Например, следующий код НЕ будет работать:
var objUser = new();//Error: There is no target type for 'new()'
Если мы вернемся к C#, то обнаружим, что подобное поведение уже было в C# для неявно типизированных выражений массива, где мы смогли создать массив, как показано ниже:
var myArray = new []{1, 2, 3};
Хорошо, а теперь давайте посмотрим на эту функцию и с другой точки зрения. Вы помните ключевое слово var
` и его использование? Отлично, когда мы можем опустить Тип, есть ли разница, опускать его с левой или с правой стороны выражения? давайте посмотрим на эти два выражения:
User objUser1 = new(); var objUser2 = new User();
На первый взгляд кажется пустой тратой времени думать о выражении new() целевого типа. Но так ли это и все ли это? Наверняка НЕТ. почему? Предположим, вы собираетесь определить поле класса. Можете ли вы использовать var
` для определения поля в классе? Нет :-) На самом деле var
` полезно, когда мы собираемся определить локальную переменную.
Что компилятор думает о var
` и целевом типе new()? Компилятор сгенерирует один и тот же код IL как для выражения var
`, так и для нового выражения целевого типа. В нашем примере компилятор сгенерирует следующий IL-код после компиляции:
User objUser1 = new User(); User objUSer2 = new User();
Вы можете прочитать больше об этой теме на: