zl程序教程

您现在的位置是:首页 >  后端

当前栏目

浅析c#范型中的特殊关键字where&default

c#amp 关键字 浅析 特殊 Default where
2023-06-13 09:15:05 时间

在看源码的时候看见了where和default,虽说default很常见,但是它的用法我却是第一次看到,哎,基础不扎实啊!

下面介绍下这两个特殊的关键字:
一、Where关键字
where子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
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就是为范型指定类型约束。

二、Default关键字
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型T:

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子句

还可以将约束附加到泛型方法的类型参数

请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的