clr via c# 泛型
1,类型对象,对于应用程序的各种类型创建的对象叫做类型对象:Type object;对于泛型类型参数的类型,CLR同样也会创建内部类型对象,适用于
- 引用类型
- 值类型
- 接口类型
- 委托类型
具有泛型类型参数的类型称为:开放类型。
指定了泛型实参的类型称为:封闭类型。比如 Dictionary<TKey,TVale>称为开放类型,Dictionary<string,int>称为封闭类型
2,委托和接口泛型的逆变和协变。
Func<object, ArgumentException> fn1 = (x) => { Console.WriteLine(x); return null; };
Func<string, Exception> fn2 = fn1;
Exception e = fn2("x");
Console.ReadKey();当一个委托或者一个接口类型,其泛型参数前面带in时,则允许接受该参数为其派生类的委托的实列。
- 当一个委托或者一个接口类型,其泛型参数前面带out时,则允许接受该参数为其基类的委托的实列。比如上面。
- string 是 object 的派生类,Exception 是 ArgumentException 的基类。所以可以赋值。
3,泛型的约束
public static T Min<T>(T o1,T o2 ) where T : IComparable<T>
{
if (o1.CompareTo(o2) < 0) return o1;
return o2;
}
public static void CallMin()
{
object o1 = "jeff", o2 = "Richter";
object oMin = MinType.Min<string>((string)o1, (string)o2);
}
利用约束,则在泛型函数内部可以使用约束特有的性质
- 类型参数,可以指定0个或者多个主要约束,组要约束不可以是,Object,Array,Delegate,ValueType,Enum,Void
- 特殊的类型:class--表明是引用类型,则可以赋值 null;struct---值类型,支持default(T);支持 new T();
- 特殊的类型:new()---则支持 new()操作构造器约束
private static List<TBase> ConvertIList<T, TBase>(IList<T> list) where T : TBase
{
List<TBase> baseList = new List<TBase>(list.Count);
for (int index = 0; index < list.Count; index++)
{
baseList.Add(list[index]);
}
return baseList;
}
public static void CallingConvertIList()
{
IList<String> ls = new List<string>();
ls.Add("a string");
//1,将IList<string> 转换为 IList<Object>
IList<object> l1 = ConvertIList<string, object>(ls);
//2,将Ilist<string>转换为IList<IComparable>
IList<IComparable> l2 = ConvertIList<string, IComparable>(ls);
//3,将Ilist<string>转换为IList<Exception>
IList<Exception> l3 = ConvertIList<string, Exception>(ls);
}
l3的时候,失败,应为不能进行类型的转换。
4,泛型变量的类型引用
//方法1:
private void Cast<T>(T obj)
{
int x =(int)obj;//错误,不允许
int x =(int)(object)obj//允许,但是可能会在运行时报错
string x= obj as string;//允许,在引用类型时候 }
5,将泛型类型变量设为默认值,如果是7引用类型,则设为null,如果是值类型,则设为0.
T temp = default(T);
6,将泛型类型和null进行比较。允许,但是当T约束为struct时,不允许。
7,比较操作==,!= 非法,必须约束为引用类型。因为引用类型的比较时合法的,但是值类型的比较是非法的,除非其重载了==操作符。
clr via c# 泛型的更多相关文章
- CLR VIA C# 泛型的协变和逆变
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- CLR via C#深解笔记六 - 泛型
面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...
- [CLR via C#]12. 泛型
泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开 ...
- CLR类型设计之泛型(一)
在讨论泛型之前,我们先讨论一下在没有泛型的世界里,如果我们想要创建一个独立于被包含类型的类和方法,我们需要定义objece类型,但是使用object就要面对装箱和拆箱的操作,装箱和拆箱会很损耗性能,我 ...
- CLR via C#关于泛型(Generics )的摘录
泛型,是CLR和编程语言提供的一种特殊机制,它支持另一种形式的代码重用,即“算法重用”. 简单的说,开发人员先定义好一个算法,比如排序.搜索.交换.比较或者转换等.但是,定义算法的开发人员并不设改算法 ...
- 《CLR via C#》读书笔记 之 泛型
第十二章 泛型 2014-06-15 初始泛型 12.3 泛型基础结构 12.3.1 开放类型与封闭类型 12.3.2 泛型类型和继承 12.3.3 泛型类型同一性 12.3.4 代码爆炸 12.6 ...
- 重温CLR(八 ) 泛型
熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...
- 泛型(Generics)
Framework类库中的泛型 泛型可以使代码重用,提高开发效率 CLR允许在引用类型.值类型或接口中定义泛型方法: CLR允许创建泛型引用类型.泛型值类型(枚举不允许创建).泛型委托类型和泛型接口类 ...
- CLR总览
Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...
随机推荐
- UIKit, AppKit, 以及其他API在多线程当中的使用注意事项
UIKit, AppKit, 以及其他API在多线程当中的使用注意事项 Overview The Main Thread Checker is a standalone tool for Swift ...
- 团队项目——Beta冲刺
团队项目-Beta冲刺 作业所属课程 软件工程 作业要求 团队项目-Beta冲刺 团队名称 运气王团队 作业目标 (1)SCRUM部分(2)PM 报告 成员列表: 1.团队成员的学号列表 |何宸锐(组 ...
- linux系统iot平台编程阶段总结
1.inline内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 在使用循 ...
- Matplotlib API汉化 Pyplot API
https://www.cnblogs.com/chenxygx/p/9554443.html
- C#系列之基础知识点(一)
知识点一:VS启动方法 第一种:双击图标 第二种:window+R——调出cmd,输入devenu properties 属性的意思 知识点二:后缀名解释 .sln 解决方案文件:包含整个解决方案 ...
- 最大连续和(dp复习)
最大连续和:给出一段序列,选出其中连续且非空的一段使得这段和最大. stdin: 7 2 -4 3 -1 2 -4 3 stdout: 4 状态转移方程:dp[i]=max(dp[i-1]+a[i], ...
- Codeforces_828
A.模拟,注意单人的时候判断顺序. #include<bits/stdc++.h> using namespace std; int n,a,b; int main() { ios::sy ...
- java13人机猜拳
public class Demo01 { public static void main(String[] args) { /* * 你同桌和你要玩游戏. * 1 剪刀,2 石头,3 布 */ // ...
- mongodb副本集群搭建
一.环境介绍 1.机器信息 10.40.6.68 10.40.6.108 10.40.6.110 软件环境为centos 6.x 2.mongodb 下载链接地址 https://www.mongod ...
- RabbitMQ安装与使用
官网地址: http://www.rabbitmq.com/ 安装Linux必要依赖包 下载RabbitMQ必须安装包 进行安装,修改相关配置文件即可 步骤 1.准备: yum install gcc ...