你好
t = new T[10]; 这句代码是【创建】一个T类型的长度为10的【数组】。
数组中的值为全部为null。就是说创建了数组,没有创建T类型的对象。
t = new T();这句代码是【创建】一个T类型的【对象】。
但是T类型中可能没有无参的构造器。如:
public class Person
{
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
使用约束
public class AAwhere T :new ()
就是保证T类型必须有一个无参构造器。保证对象一定能被构造。
泛型类:
public class MyClass
{
public T MyElement { get; set; }
}
泛型函数:
public T ReturnElement
{
throw new NotImplementedException();
}
但是当需要对MyElement进行实例化的时候,却不能使用new(),只要添加如下代码即可进行实例化了:
泛型类:
public class MyClass
{
public T MyElement { get; set; }
public MyClass()
{
this.MyElement = new T();
}
}
泛型函数:
public T ReturnElement
{
return new T();
}
在这里,where实际上对泛型类型T的一个限定或补充。如果你希望T是一个int的集合,这个集合可以是List
public T ReturnElement
where T : ICollection
{
return new T();
}
进一步,如果希望放宽集合中元素的类型,比如只要是int,double等可比较的类型,它们都是从IComparable继承而来,则可以继续添加如下限定:
public T ReturnElement
where T : ICollection, new()
where S : IComparable
{
return new T();
}
不同的T构造的方式是不同的,有点需要1000字节的内存,有的需要8字节内存。而数组不同,它只是个容器,占用内存统一是一个引用,等你给数组这个容器里添加实际内容的时候,同样需要约束,比如t = new T[10]; t[0]=new T();后一句才是真正的new了一个T,前一句只是声明容器。
new T[10]只是声明,还没赋值,只是10个空指针,你知道不管是什么对象的指针都基本是个整数,所以和类型无关。而new是实实在在地开辟了T类型的空间。
public T[ ] t 是数组,不需要new