type参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()约束。
当你需要这个约束时,你能给我一个示例场景吗?
答案 0 :(得分:9)
这基本上是new()
约束归结为:
class Factory<T> where T : new()
{
public T Create()
{
return new T();
// ^^^^^^^
// this requires the new() type constraint.
}
}
现在,您不允许将参数传递给构造函数。如果你想要初始化新的对象,你可以实现这一点,例如通过引入进一步的约束:
interface ILikeBananas
{
double GreenBananaPreferenceFactor { get; set; }
}
class Factory<T> where T : ILikeBananas, new()
{
public T Create(double greenBananaPreferenceFactor)
{
ILikeBananas result = new T();
result.GreenBananaPreferenceFactor = greenBananaPreferenceFactor;
return (T)result;
// ^^^^^^^^^
// freely converting between ILikeBananas and T is permitted
// only because of the interface constraint.
}
}
请注意,另一种实例化对象的方法是通过Activator.CreateInstance
,它可以为您提供更多自由,例如将参数直接传递给构造函数。
Activator.CreateInstance
并不严格要求new()
约束;但是,实例化的类型仍然需要提供合适的构造函数。
答案 1 :(得分:1)
在成为某种事物的唯一方式的意义上,很少需要 。但有时这是做某事的最简单方法。
例如,假设你正在编写一个对象池。当有人想要从池中获取一个对象时,它会返回一个现有对象,或者只是在没有可用的情况下创建一个新对象。您可以添加where T : new()
约束,以便自己简单地编写return new T();
。
这里的约束不是 ,因为你可以通过在池的构造函数中使用Func<T>
并使用它来完成同样的事情。可以说,这种方法实际上更好,因为它更灵活。但同样,new T()
也很简单。
答案 2 :(得分:0)
我只想举一个简单的例子。 我创建了一个方法:
public T GetFromXml<T>(string xml)
where T: class, new()
{
if (String.IsNullOrEmpty(xml))
{
return new T();
}
return xml.AsObjectFromXml<T>();
}
并像这样使用它:
Phones = GetFromXml<List<PhoneData>>(source.Phones);
因为我更喜欢空集合而不是空值。