Ограничение 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"
Смотрите также
-
несколько ограничений,
гдеnew()часто идёт последним -
ограничение базы,
которое сочетают сnew()для фабрик -
оператор
new,
который создаёт экземпляр конкретного типа -
конструктор,
который должен быть доступен без параметров