浅析c#范型中的特殊关键字where&default
2023-06-13 09:15:05 时间
在看源码的时候看见了where和default,虽说default很常见,但是它的用法我却是第一次看到,哎,基础不扎实啊!
1.接口约束。
例如,可以声明一个泛型类MyGenericClass,这样,类型参数T就可以实现IComparable<T>接口:
publicclassMyGenericClass<T>whereT:IComparable{}
2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。
classMyClassy<T,U>
whereT:class03.whereU:struct04.{
}
3.where子句还可以包括构造函数约束。
可以使用new运算符创建类型参数的实例;但类型参数为此必须受构造函数约束new()的约束。new()约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:
publicclassMyGenericClass<T>whereT:IComparable,new()
{
//Thefollowinglineisnotpossiblewithoutnew()constraint:04.Titem=newT();
}
new()约束出现在where子句的最后。
4.对于多个类型参数,每个类型参数都使用一个where子句
例如:
interfaceMyI{}
classDictionary<TKey,TVal>
whereTKey:IComparable,IEnumerable
whereTVal:MyI
{
publicvoidAdd(TKeykey,TValval)
{
}
}
5.还可以将约束附加到泛型方法的类型参数,例如:
publicboolMyMethod<T>(Tt)whereT:IMyInterface{}
请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:
delegateTMyDelegate<T>()whereT:new()
总之,Where就是为范型指定类型约束。
T是引用类型还是值类型。
如果T为值类型,则它是数值还是结构。
给定参数化类型T的一个变量t,只有当T为引用类型时,语句t=null才有效;只有当T为数值类型而不是结构时,语句t=0才能正常使用。
解决方案是使用default关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自GenericList<T>类的示例显示了如何使用default关键字。
publicclassGenericList<T>
{
privateclassNode
{
//...06.07. publicNodeNext;
publicTData;
}
privateNodehead;
//...14.15. publicTGetNext()
{
Ttemp=default(T);
Nodecurrent=head;
if(current!=null)
{
temp=current.Data;
current=current.Next;
}
returntemp;
}
}
2. default另一种用法
在switch语句中,如果没有任何case表达式与开关值匹配,则控制传递给跟在可选default标签后的语句。如果没有default标签,则控制传递到switch以外。
intid=int32.Parse(Console.ReadLine());
switch(id)
{
case1:
Console.WriteLine("Lee");
break;
case2:
Console.WriteLine("Tang");
break;
default:
Console.WriteLine("Sorry,noonematchthisID!");
break;
}
where子句还可以包括构造函数约束。可以使用new运算符创建类型参数的实例;但类型参数为此必须受构造函数约束new()的约束。
new()约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。
new()约束出现在where子句的最后。
对于多个类型参数,每个类型参数都使用一个where子句
还可以将约束附加到泛型方法的类型参数
请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的
相关文章
- C# bindingnavigatro删除事件修改&&遍历指定容器的控件
- C# SplitContainer 控件详细用法
- c# 多线程并发-金三银四面试:C#.NET面试题高级篇2-多线程
- 【愚公系列】2023年02月 .NET/C#知识点-程序运行计时的总结
- C程序操作MySQL数据库的锁表实现方法(c# mysql 锁表)
- 如何增加Oracle数据库的AMP值(amp值oracle)
- C#多线程Singleton(单件)模式模板
- C#读写操作app.config中的数据应用介绍
- 使用C#开源文件实时监控工具Tail&TailUI介绍
- C#定位txt指定行的方法小例子
- 解决C#截取当前程序窗口指定位置截图的实现方法
- 使用c#开发公众平台自定义菜单功能
- c#反射表达式树模糊搜索示例
- c#多种加解密示例(md5加密解密)
- C#批量更新sql实例
- C#算法设计之关于1000瓶水的问题
- C#使用RenderControl将GridView控件导出到EXCEL的方法