Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
1113 of 1492 menu
◀ ▶

Ограничение new()

В списке ограничений пишут new() - так компилятор разрешает создавать экземпляр T через new внутри обобщённого кода. Ограничение ставят после других условий для того же параметра, кроме allows ref struct. Его не сочетают с struct и unmanaged, потому что у типов-значений конструктор без параметров уже есть.

Синтаксис

class Factory<T> where T : new() { public T Create() => new T(); }

Пример

Давайте создадим объект через new T():

using System; class Token { public string Text; public Token() { Text = "abcde"; } } class Factory<T> where T : new() { public T Build() => new T(); } class Program { static void Main() { var factory = new Factory<Token>(); var item = factory.Build(); Console.WriteLine(item.Text); } }

Результат выполнения кода:

"abcde"

Пример

Давайте заполним список несколькими экземплярами одного типа:

using System; using System.Collections.Generic; class Row { public int Num; public Row() { Num = 5; } } class Batch<T> where T : new() { public List<T> Fill(int count) { var list = new List<T>(); for (int i = 0; i < count; i++) { list.Add(new T()); } return list; } } class Program { static void Main() { var batch = new Batch<Row>(); var list = batch.Fill(2); Console.WriteLine($"{list[0].Num} {list[1].Num}"); } }

Результат выполнения кода:

5 5

Пример

Давайте вернём значение по умолчанию и новый объект из одного метода:

using System; class Code { public string Value = "12345"; } class Maker<T> where T : new() { public T Fresh() => new T(); } class Program { static void Main() { var maker = new Maker<Code>(); Console.WriteLine(maker.Fresh().Value); } }

Результат выполнения кода:

"12345"

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить