昨天开始学习泛型,一天的时间,看下来,感觉最难让我理解的就是泛型约束。于是今天一个上午都在看例子,看资料。都说泛型约束的理解对泛型的学习很关键,于是发个帖子,阐述一下我的理解,高手指点,有错误,请指教。派生约束(就是基类约束和接口约束)class PhoneList<T> where T : PhoneNumber
{
public T FindPhoneByNumber(string number)
{
if (list != null)
{
foreach (T t in list)
{
if (!object.Equals(t, null))
{
if (t.Number == number)
{
return t;
}
}
else
{
return null;
}
}
}
return null;
}
}T的类型应该是继承PhoneNumber或者和PhoneNumber同类型,也就是T的实例化t就是PhoneNumber的派生类或者就是PhoneNumber。t打点之后,能够找到PhoneNumber中的方法和属性,我个人感觉其实这就是继承了PhoneNumber类。接口也同理,如果是接口,那么T的实例化就是实现了接口的类。这样方便很多,能过使用的方法不单单只是object的方法了。同时也限制了参数的类型。构造函数约束
这个我理解的比较浅,类型参数必须具有无参数的公共构造函数。也就是冒号后面的那个类的构造函数的是没有参数的。值类型约束
冒号后面是struct,我觉得这个好理解,应该是T就是值类型。引用类约束
冒号后面是class,应该是T就是引用类型。个人觉得比较难理解的派生约束,我以前没有学过C++,所以理解起来比较难。不知道我这样理解行不行,高手指点啊~~
{
public T FindPhoneByNumber(string number)
{
if (list != null)
{
foreach (T t in list)
{
if (!object.Equals(t, null))
{
if (t.Number == number)
{
return t;
}
}
else
{
return null;
}
}
}
return null;
}
}T的类型应该是继承PhoneNumber或者和PhoneNumber同类型,也就是T的实例化t就是PhoneNumber的派生类或者就是PhoneNumber。t打点之后,能够找到PhoneNumber中的方法和属性,我个人感觉其实这就是继承了PhoneNumber类。接口也同理,如果是接口,那么T的实例化就是实现了接口的类。这样方便很多,能过使用的方法不单单只是object的方法了。同时也限制了参数的类型。构造函数约束
这个我理解的比较浅,类型参数必须具有无参数的公共构造函数。也就是冒号后面的那个类的构造函数的是没有参数的。值类型约束
冒号后面是struct,我觉得这个好理解,应该是T就是值类型。引用类约束
冒号后面是class,应该是T就是引用类型。个人觉得比较难理解的派生约束,我以前没有学过C++,所以理解起来比较难。不知道我这样理解行不行,高手指点啊~~
在泛型类型定义中,where 子句用于指定对下列类型的约束:这些类型可用作泛型声明中定义的类型参数的实参。可以限制是继承自某个基类,值类型或是引用类型,是否具有无参构造函数(即,是否可以用 new T()构造对象)。.net的托管开发是强类型的语言。c++是弱类型语言。别说不约束了。内存块可以被描述为任何类型,当然你随便乱转是会出错,这既是c/c++的灵活,也是带来隐患的地方。
正解.