永发信息网

C# 泛型类 构造方法中实例化T

答案:5  悬赏:40  手机版
解决时间 2021-01-16 08:31
C# 泛型类 构造方法中实例化T
最佳答案
你好
    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 AA where T :new ()  就是保证T类型必须有一个无参构造器。保证对象一定能被构造。
全部回答
泛型类:
public class MyClass
{
public T MyElement { get; set; }
}
泛型函数:
public T ReturnElement()
{
throw new NotImplementedException();
}

但是当需要对MyElement进行实例化的时候,却不能使用new(),只要添加如下代码即可进行实例化了:
泛型类:
public class MyClass where T: new()
{
public T MyElement { get; set; }
public MyClass()
{
this.MyElement = new T();
}
}
泛型函数:
public T ReturnElement() where T : new()
{
return new T();
}

在这里,where实际上对泛型类型T的一个限定或补充。如果你希望T是一个int的集合,这个集合可以是List,也可以是HashSet等等,只要它们都是从ICollection继承而来的,则可以添加对类型T的限定,同时要保证它还是可以实例化的:
public T ReturnElement()
where T : ICollection, new()
{
return new T();
}

进一步,如果希望放宽集合中元素的类型,比如只要是int,double等可比较的类型,它们都是从IComparable继承而来,则可以继续添加如下限定:
public T ReturnElement()
where T : ICollection, new()
where S : IComparable
{
return new T();
}
  • 2楼网友:廢物販賣機
  • 2021-01-16 09:29
new T[10]只是声明,还没赋值,只是10个空指针,你知道不管是什么对象的指针都基本是个整数,所以和类型无关。而new是实实在在地开辟了T类型的空间。
  • 3楼网友:白昼之月
  • 2021-01-16 08:00
不同的T构造的方式是不同的,有点需要1000字节的内存,有的需要8字节内存。而数组不同,它只是个容器,占用内存统一是一个引用,等你给数组这个容器里添加实际内容的时候,同样需要约束,比如t = new T[10]; t[0]=new T();后一句才是真正的new了一个T,前一句只是声明容器。
  • 4楼网友:躲不过心动
  • 2021-01-16 07:09
public T[ ] t 是数组,不需要new
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯