0Pricing
C# Academy · Урок

Выражения 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 — локальная установка не требуется.

Все уроки этого курса

  1. Вывод типа локальных переменных с var
  2. Когда следует избегать var
  3. Тип dynamic
  4. Выражения new с выводом типа по контексту
← Назад к C# Academy