zoukankan      html  css  js  c++  java
  • C#编程(二十六)----------泛型

    泛型

    有了泛型,就可以创建独立于被包含类型的类和方法了.我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可.

    另一个减少代码的选项是使用object,object类不是类型安全的,泛型类使用泛型类型,并可以根据需要用特定的类型替代泛型类型.这就保证了类型安全性:如果某个类不支持泛型类,编译器就会报错.

    对于C++模版,在特定的类型实例化模板时,需要模版的源代码.相反,泛型不仅是C#语言的一种结构,而且是CLR定义的.所以,即使泛型类是在C#重定义的,也可以在VB中用一个特定的类型实例化该泛型的.

    对值类型使用非泛型集合,在把值类型转换为引用类型,和把引用类型转换为值类型是,需要进行装箱和拆箱操作.

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

    看下例:

    var list =new ArrayList();

                list.Add(44);

                int i1 = (int)list[0];//这里不作强制类型会出现错误

                foreach (int i2 in list)

                {

                    Console.WriteLine(i2);

                   

                }

                Console.ReadKey();

    ArrayList存储对象,add()方法定义为需要把一个对象作为参数,所以要装箱一个整数类型.在读取ArrayList中的值时,要进行拆箱,把对象类型转换为引用类型.,这需要强制类型转换

    拆装箱很容易实现,但性能损失比较大,遍历许多项时尤其如此.

    看下例:在命名空间using System.Collections.Generic;中 

    var list = new List<int>();

                list.Add(44);

                int i1 = list[0];

                foreach (int item in list)

                {

                    Console.WriteLine(item);

                }

                Console.ReadKey();

    List<T>类不使用对象,而是在使用时定义类型.所以不用进行拆装箱操作.

    类型安全

    :

    var list = new ArrayList();

                list.Add(44);

                list.Add("mystring");

                foreach (int item in list)

                {

                    Console.WriteLine(item);

                }

                Console.ReadKey();

    但并不是集合中的所有元素都能转换为int类型的,这是可以使用var.

    但是更好的方法是使用List<T>,在使用时就明确指定类型

    泛型允许更好的重用二进制代码,泛型可以定义一次,并且可以使用许多不同的类型实例化.不需要像C++模版那样访问源代码.

    案例:

    var list = new List<int>();

                list.Add(44);

                var stringList = new List<string>();

                stringList.Add("mystring");

                var classList=new List<MyClass>();

                classList.Add(new MyClass);

    命名约定

    如果在程序中使用泛型,在区分泛型类型和非泛型类型时就会有一定的帮助.下面是泛型类型的命名规则:

    1.泛型类型的名称用字母T作为前缀

    2.如果没有特殊的要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类型的名称.

    public class List<T>{}

    public class LinkedList<T>{}

    3.如果泛型类型有特定的要求(例如,必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型,就应该给泛型类型使用描述性的名称:

    public delegate void EventHandle<TEventArgs>(object sender,TEventArgs e);

    public delegate TOutput Converter<TInput ,TOutput> (Tinput from);

    public class SortedLIst<TKey,Tvalue>{};

  • 相关阅读:
    jvm 致命问题分析
    java 包引入时*会全部加载吗
    JDK压缩指针
    ArrayList && HashMap扩容策略
    数据结构对齐 堆对齐 栈对齐
    TLS Thread Local Storage
    vue2 设置网页title的问题
    error ...项目路径 ode_moduleschromedriver: Command failed.
    Vue打包后出现一些map文件
    'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6593052.html
Copyright © 2011-2022 走看看