Выражения new с выводом типа по контексту
Упрощайте создание объектов с помощью вывода типа по контексту.
«Выражения new с выводом типа по контексту» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
new с целевым типом
Начиная с C# 9, можно написать Type x = new(); и не указывать тип после new, если целевой тип известен.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
List<int> numbers = new();
numbers.Add(1);
Console.WriteLine(numbers.Count);
}
}Устранение повторений
Когда тип уже указан в объявлении переменной, повторять его после new излишне. Пустая форма new() устраняет это повторение.
using System;
using System.Text;
class Program {
static void Main() {
StringBuilder sb = new();
sb.Append("Hi");
Console.WriteLine(sb.ToString());
}
}Передача аргументов конструктора
В форме new() с целевым типом по-прежнему можно передавать аргументы конструктора в круглых скобках.
using System;
class Point {
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
}
class Program {
static void Main() {
Point p = new(3, 4);
Console.WriteLine(p.X + ", " + p.Y);
}
}С инициализаторами объектов
Можно сочетать new с целевым типом и блок инициализатора объекта.
using System;
class User {
public string Name;
public int Age;
}
class Program {
static void Main() {
User u = new() { Name = "Ann", Age = 30 };
Console.WriteLine(u.Name + " " + u.Age);
}
}В полях
new с целевым типом работает и для инициализаторов полей, делая объявления более лаконичными.
using System;
using System.Collections.Generic;
class Program {
static List<string> items = new();
static void Main() {
items.Add("a");
Console.WriteLine(items.Count);
}
}В аргументах методов
Если тип параметра известен, можно передать new() непосредственно в качестве аргумента.
using System;
using System.Collections.Generic;
class Program {
static void Print(List<int> list) {
Console.WriteLine(list.Count);
}
static void Main() {
Print(new());
}
}Возврат new()
Если тип результата метода известен, можно вернуть new(), не повторяя имя типа.
using System;
using System.Collections.Generic;
class Program {
static List<int> Make() {
return new() { 1, 2, 3 };
}
static void Main() {
Console.WriteLine(Make().Count);
}
}Сравнение с var
var x = new List<int>() указывает тип справа, а List<int> x = new() — слева. Выбирайте вариант, который лучше читается.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var a = new List<int>();
List<int> b = new();
Console.WriteLine(a.Count + b.Count);
}
}Неоднозначность приводит к ошибке
Если компилятор не может определить целевой тип, new() завершается ошибкой. Целевой тип должен быть понятен из контекста.
using System;
class Program {
static void Main() {
object o = new object();
Console.WriteLine(o.GetType().Name);
}
}Читаемость при длинных типах
new с целевым типом особенно удобен для многословных обобщённых типов, поскольку позволяет не записывать тип дважды.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
Dictionary<string, List<int>> map = new();
map["a"] = new() { 1, 2 };
Console.WriteLine(map["a"].Count);
}
}Современный стиль
new с целевым типом сохраняет объявления чистыми, одновременно обеспечивая полную статическую типизацию и проверки компилятора.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
Queue<string> q = new();
q.Enqueue("first");
Console.WriteLine(q.Dequeue());
}
}Быстрая проверка
Проверьте понимание выражений new с целевым типом.
Итоги
new() с целевым типом позволяет не указывать тип после new, когда целевой тип уже известен, уменьшая повторения в объявлениях, полях, аргументах и возвращаемых значениях.
При этом по-прежнему поддерживаются аргументы конструктора и инициализаторы; при неоднозначном типе возникает ошибка. Такой современный стиль полностью типобезопасен и хорошо дополняет var.
Часто задаваемые вопросы
Урок «Выражения new с выводом типа по контексту» бесплатный?
Да — полный текст урока «Выражения new с выводом типа по контексту» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выражения new с выводом типа по контексту»?
Упрощайте создание объектов с помощью вывода типа по контексту. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Выражения new с выводом типа по контексту»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Вывод типа локальных переменных с var
- Когда следует избегать var
- Тип dynamic
- Выражения new с выводом типа по контексту