C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)

【重点】泛型:有了泛型,就可以创建独立于被包含类型的类和方法了。我们不必给不同的类型编写功能相同的许多方法和类,只创建一个方法或类即可,以下是泛型的特点:性能、类型安全性、二进制代码重用、代码的扩展、命名约定

  1、性能:空间的泛型和非泛型集合类 System.Collections 和 System.Collections.Generic

    值类型存储在栈上,引用类型存储在堆上。 C# 类 是引用类型,结构是值类型。 .NET很容易把值类型转换为引用类型,所以可以在需要对象(对象是引用类型)的任何地方使用值类型。例如,int 可以赋予一个对象。从值类型转换为引用类型成为装箱。如果方法需要把一个对象作为参数,同时传递一个值类型,装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型强制转换运算符。

  [延伸]装箱和拆箱

【装箱和拆箱】
下面可以像处理对象那样处理字面值:
    string s=10.ToString();//隐式转换

C#通过拆箱(unboxing)和装箱(boxing)可以把值类型转换为引用类型,并把引用类型转换回值类型。
    【装箱】:用于描述把一个值类型转换为引用类型。运行库会为堆上的对象创建一个临时的引用类型“箱子”。
    int myIntNumber=20;
    object myObject=myIntNumber; //显示转换

    【拆箱】用于描述相反的过程,其中以前 装箱的值类型 强制转换回 值类型。这里使用术语 “强制转换”,是因为这种转换时显示进行的。
    int myIntNumber=20;
    object myObjet=myIntNumber;//把 myIntNumber 进行装箱
    int mySecondNumber=(int)myObject;//拆箱 强制转换

    ★只能对以前装箱的变量进行拆箱,当myObject 不是装箱后的int 型时,如果执行最后一行就会抛出异常。

    !!这里有一个警告,在拆箱时,必须非常小心,确保得到的值变量有足够的空间存储拆箱的值中的左右字节。例如 C# 的int 有 32位 ,所以把 long 值(64位) 拆箱为 int 时,会导致一个 InvalidCastException 异常。
    long myLongNumber=32323131;
    object myObject=myLongNumber;
    int myIntNumber=(int)myObject;

  例 System.Collection 中的 ArrayList类中进行的拆箱装箱操作 ArrayList存储对象,Add()方法定义为需要把一个对象作为参数。

1 var list=new ArrayList();
2 list.add(44);//进行装箱,把值类型转换为引用类型
3 int i1=(int)list[0];//拆箱
4
5 foreach(int i2 in list)
6 {
7     Console.WriteLine(i2);//进行拆箱
8 }

  >>装箱和拆箱很容易使用,但性能损失比较大,遍历许多项时尤其如此。

  

  System.Collections.Generic 中的 List<T> 类不使用对象,而是在使用时定义类型。在下面的例子中,List<T> 类的泛型定义为 int ,所以int 类型在JIT 编译器动态生成的类中是哟ing,不再进行拆箱装箱

1 var list=new ArrayList<int>();
2 list.Add(22);//不在进行装箱
3 int i1=list[0]; //不再进行拆箱 转换
4 foreach(int i2 in list)
5 {
6     Console.WriteLine(i2);
7 }

  2、类型安全

   与ArrayList 类一样,如果使用对象,就可以在这个集合中添加任意类型。下面的例子在ArrayList类型的集合中添加一个整数、一个字符串和一个MyClass 类型的对象;

    

 1 var list=new ArrayList();
 2
 3 list.Add(22);
 4 list.Add("GellW");
 5 list.Add(new MyClass());
 6
 7 //当使用下面的foreach 来迭代时,并不是所有元素都可以强制转换为 int 就会抛出一个运行异常
 8 foreach(int i2 in list)
 9 {
10     Console.WriteLine(i2);
11 }

  若在泛型类 List<T> 中泛型类型 T 定义了允许使用的类型。有了 比如 List<int> 的定义,就只能把整数类型添加到集合中。编译器就不会编译这段代码,因为 Add 的参数无效

  

1 var list=new ArrayList<int>();
2 list.Add(44);
3 list.Add("Geell");//编译时错误
4 list.Add(new MyClass());//编译时错误。

  【扩展】

  

var : 该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。在声明时必须同时赋值。

  3、二进制代码的重用

1 var list1=new List<int>();
2 list1.Add(44);
3
4 var list2=new List<stirng>();
5 list2.Add("Stringhisdm");
6
7 var list3=new List<MyClass>();
8 list3.Add(new MyClass());

  4、命名约定

    • 泛型类型的名称用字母T 作为前缀。
    • 如果没有特殊要求,泛型类型允许使用任意类替代,且只是用了一个泛型类型,就可以用字符T作为泛型类型的名称。    
    • 1 public class List<T>{}
      2
      3 public class LinkedList<T>{}
    • 如果泛型类型有特定的要求(例如,它必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称: 
    • 1 public delegate void EventHandle<TEventArgs>(object sender,TEventArgs e);
      2
      3 public delegate TOutput Converter<TInput,TOutput>(TInput from);
      4
      5 public class SortedList<TKey,TValue>{}
时间: 2024-08-16 03:38:02

C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)的相关文章

传智播客 2015 刘意 Java基础-视频-笔记day27(完结)(2016年5月1日12:42:20)

day27 1.类的加载概述和加载时机 2.类加载器的概述和分类 类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象. 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行. 类加载器的组成 Bootstrap ClassLoader根类加载器 Extension ClassLoader扩展类加载器 SysetmClassLoader系统类加载器 通过这些描述我们就可以知道我们常用的东西的加载都是由谁来完成的. 到目前为止我们已经知道把class文

崔希凡JavaWeb笔记day25-day27(2016年11月11日22:02:34)

JavaWeb的学习进入尾声,最近三个dayy做了项目,也完成了一些的基础加强 以下是本人的原创笔记 链接:http://pan.baidu.com/s/1mhUtdgc 密码:1ov4

崔希凡JavaWeb笔记day19-day21(2016年10月4日17:38:58)

难点:jdbc分页查询,以及filter的几个案例 笔记分享如下 链接:http://pan.baidu.com/s/1o8NbI3o 密码:4fnc

2016年1月13日前端笔记

一.$.fn.name 指 jquery 的命名空间加上fn的方法和属性会对每一个jquery实例都有效 例: $.fn.abc(); 是对Jquery 扩展了一个abc方法,那么后面的每一个jquery实例都可以引用这个方法 如: $('div').abc(); jquery为开发插件提供了两个方法: 为扩展jquery类本身,为类添加新的方法. jquery.extend(object); 给jquery对象添加方法 jquery.fn.extend(object); jQuery.fn=j

总结——2016年1月13日

最近学习了计算机基础,和JAVA入门. 主要学习内容有: 1.计算机基础:计算机的发展.应用.组成:操作系统:办公软件的使用:思维导图的概念. 对我而言,思维导图是全新的东西,需要更多的练习画思维导图,并在以后的工作.生活中学以致用. 2.程序设计基础: a.程序:完成某些事务的一种既定方式和过程.在日常生活中,可以将程序看成对一系列动作的执行过程的描述.计算机中的程序就是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合,通过程序实现人机对话的过程. b.二进制转换:除2取余,

2016年4月13日作业

一.外包管理 1.外包的形式有哪五种?什么是利益关系? 活动外包.服务外包.内包.合包.利益关系 利益关系是一种长期的合作关系,双方先为此关系进行投资,再根据预先拟定的协议分享利益,共同承担风险,同时共享利益. 2.外包管理的目标是什么?要实现这个目标,对外包管理提出哪四个方面的要求? 软件外包管理的总的目标是用强有力的手段来管理同时进行的众多外包项目,满足进度.质量.成本的要求.要实现这个目标就对外包管理提出了以下四方面的要求. 1)慎重选择合格的软件承包商; 2)互相同意对方的承诺; 3)需

薛老师软考高项学员:2016年4月13日作业

一.外包管理 1.外包的形式有哪五种?什么是利益关系? 活动外包.服务外包.内包.合包.利益关系: 利益关系是一种长期合作关系,双方先为此关系进行投资,再根据预先拟定的协议分享利益,共同承担风险,同时共享利益.如果利益无法实现,供应商不会因他们的努力与投入而获得任何报酬. 2.外包管理的目标是什么?要实现这个目标,对外包管理提出哪四个方面的要求? 外包管理的目标是用强有力的手段来管理同时进行的众多外包项目,满足进度.质量.成本的要求.要实现这个目标就对外包管理提出了以下四方面要求. 慎重选择合格

2016年4月13日

1.urmdir mkdir都是创建删除目录,-p parents 让其不报错而已 -v 可视化的意思 -pv   可以看见其过程 总体上可以理解成文件在界面上复制粘贴 2. rm -i  本来就属于默认 -f  强制 -v  可视化 -r  删除下面的东西,一定要有的 rm -r 只是删除路径的最后一层,-r是强制把最后一层目录中的所有文件都删除.还有rm -rf 不要乱用,小心在 / 下执行,你就知道后果了 3.拷贝目录就用-r cp-r   理解成先动金字塔顶 后动拓扑分支 4.unali

软考中高项学员:2016年4月13日作业

一.外包管理1.外包的形式有哪五种?什么是利益关系? 活动外包.服务外包.内包.合包.利益关系 利益关系是一种长期的合作关系,双方先为此关系进行投资,再根据预先拟定的协议分享利益,共同承担风险. 2.外包管理的目标是什么?要实现这个目标,对外包管理提出哪四个方面的要求? 外包管理总的目标是用强有力的手段来管理同时进行的众多外包项目,满足进度.质量.成本的要求. 对外包管理提出四个要求: 慎重选择合格的软件承包商 相互同意对方的承诺 需要经常保持交流 根据合同的承诺跟踪承包商实际完成的情况和成果