C# - Abstract类扩展了class和new()?

时间:2012-08-31 11:35:44

标签: c#

在一些现有的代码中,我看到以下内容:

public abstract class BasicComponent<T> : IBasicComponent<T> 
                                          where T : class, new()

我知道抽象类是什么,以及接口。但是,where Tclass以及new()延伸时会发生什么?

5 个答案:

答案 0 :(得分:11)

这些是generic type constraints

class表示您使用的T必须是一个类(包括接口,委托和数组),new必须具有公共无参数构造函数。

来自链接的MSDN文档:

  

其中T:class -   type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。

     

其中T:new() - 类型参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()约束。

答案 1 :(得分:1)

where T限制泛型类型T

class表示T必须是一个类,没有结构或值类型
new表示T必须具有无参数构造函数

答案 2 :(得分:1)

Where 用于声明泛型类型参数的约束,这反过来意味着编译器可以允许某些事情,否则因为它不够了解类型参数。

where T : class;

这会将类型参数T限制为class - 这意味着此方法仅接受class而不是值类型或结构。

where T : new();

这会将类型参数T限制为定义了无参数构造函数的类型。 编译器因此可以接受以下内容:

T t = new T();

答案 3 :(得分:1)

它说T必须是引用类型(class),并且必须有无参数构造函数new()

这意味着BasicComponent<T>和从它派生的类可以做只能在这种情况下完成的事情。这也意味着他们可以做一些毫无意义的事情。相反,如果我们没有它。

public abstract class BasicComponent<T>
{
  public T Build()
  {
    return new T();//can't do this without `new()` constraint.
  }
  public bool Check(T item)
  {
    return item != null;//only references types can be null, so 
                        //can't do this without `class` constraint
                        //though notice that `default(T)` works for
                        //both reference and value types.
  }
  public bool IsSame(T x, T y)
  {
    return ReferenceEquals(x, y);//pointless with value-types.
                                 //x and y would be passed to IsSame by
                                 //copying, then boxed to two different objects
                                 //then this will always return false.
                                 //as part of a generic implementation that
                                 //accepted both value and reference types
                                 //it might be that we still care to do something
                                 //for reference-equals, in other cases the 
                                 //pointlessness would make the whole class pointless
                                 //for value types.
  }
  public abstract void Whatever();//just added in so the class still does something abstractly!
}

请注意,派生自BasicComponent<T>的类必须至少同样严格 - 它必须具有BasicComponent<T>所具有的每个约束,并且可能会或可能不会添加其自身的进一步约束。

答案 4 :(得分:0)

T是您要使用的通用部分 关键字在哪里就像过滤器(类似于其他语言)

这里你使用了,class和new()

这意味着,
您可以使用任何类在此泛型类中传递。
new()意味着,你告诉班级它将具有参数较少的构造函数。