C# 泛型类 构造方法中实例化T
答案:5 悬赏:40 手机版
解决时间 2021-01-16 08:31
- 提问者网友:却不属于对方
- 2021-01-16 05:33
C# 泛型类 构造方法中实例化T
最佳答案
- 五星知识达人网友:人類模型
- 2021-01-16 06:17
你好
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类型必须有一个无参构造器。保证对象一定能被构造。
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
全部回答
- 1楼网友:一袍清酒付
- 2021-01-16 09:49
泛型类:
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();
}
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
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯