扣响C#之门笔记--第二十三章

23.1 泛型的概念

(1)在普通集合中,元素均被看做是object类型,会有以下缺点
(a)赋值时候将类型转为object,使用时候又将object转为对应的类型,在装箱和拆箱时候造成一定性能损失;
(b)任何类型的数据都可以放进集合里面,不利于类型安全检查;

        static void Main(string[] args)
        {
            Queue q = new Queue();
            q.Enqueue(10);
            q.Enqueue("wo"); //
            q.Enqueue(1);

            foreach (int item in q) //字符串无法转为int 类型输出
            {
                Console.WriteLine(item);
                Console.Read();
            }

(2)泛型集合:泛型集合和普通集合功能是一样的,唯一的区别是泛型集合元素的类型不是object类型,而是我们制定的类型
定义:Queue<T> myque =new Queue<T>();(T为我们可以指定的类型)

            //(2)泛型集合:泛型集合和普通集合功能是一样的,唯一的区别是泛型集合元素的类型不是object类型,而是我们制定的类型
            //定义:Queue<T> myque =new  Queue<T>();(T为我们可以指定的类型)
            Queue<int> my = new Queue<int>();
            my.Enqueue(10);
            //my.Enqueue("wo"); //error类型错误不符,无法赋值
            my.Enqueue(1);

(3)除了可有有泛型集合,还可以定义泛型函数,结构体,委托等,只需在函数名或者集合名后加<T>

 class Program
    {
        static void Main(string[] args)
        {

        }
        //(3)除了可有有泛型集合,还可以定义泛型函数,结构体,委托等,只需在函数名或者集合名后加<T>
        public static void swap<T>(ref T a,ref T b)
    {
        T c;
        c = a;
        a = b;
        b = a;
    }
    }

    //(4)泛型的定义中还可以含有多个类型参数
    public struct mystruce<V,K>
    { 

    }

23.2 泛型集合类

C#定义和许多常见泛型集合类,在system.collections.generic 空间下

(1)List<T>类  对应非泛型集合ArrayList

 //(1)List<T>类  对应非泛型集合ArrayList
            List<string> basketballplayer = new List<string>(5);
            basketballplayer.Add("yaoming");
            basketballplayer.Add("kobi");
            basketballplayer.Add("maidi");
            foreach (string item in basketballplayer)
            {
                Console.WriteLine(item);
            }
            Console.Read();

(2)Stack<T>类 对应非泛型集合 Stack

 //(2)Stack<T>类 对应非泛型集合 Stack
            Stack<int> s=new Stack<int>();
            s.Push(1);
            s.Push(2);
            s.Push(3);
            s.Push(4);

            foreach (var item in s)
            {
                Console.WriteLine(item);
            }
            Console.Read();
            Console.WriteLine("************"); 

(3)Queue<T>类 对应非泛型集合 Queue

//(3)Queue<T>类 对应非泛型集合 Queue

            Queue<int> q = new Queue<int>();
            q.Enqueue(1);
            q.Enqueue(2);
            q.Enqueue(3);
            foreach (var item in q)
            {
                Console.WriteLine(item);
            }
            Console.Read();

23.3 泛型的类型约束

(1)在泛型中由于泛型类型T可以是任何类型,在某些情况下(由于无法确定T的类型时候)会有问题,如下:

(2)此处,由于item为T类型,系统无法确定其类型,因此无法确定这个类型是否包含name成员,因此出错
这时候,使用类型约束(关键字 where T :+限制的范围)where T: Aniamal即可将T限制在Aniamal及其子类中,就可以知道T类型,因此就不会出错了

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    //23.3 泛型的类型约束
    //(1)在泛型中由于泛型类型T可以是任何类型,在某些情况下(由于无法确定T的类型时候)会有问题,如下:
    class AnimalFamily<T>
    //class AnimalFamily<T> where T: Aniamal
    {
        public List<T> t=new List<T>();
        public void AddList( T item)
        {
            t.Add(item);
        }
        public void Display()
        {
            foreach (var item in t)
            {
                Console.WriteLine(item.name);
                //错误    1    “T”不包含“name”的定义,并且找不到可接受类型为“T”的第一个参数的扩展方法“name”(是否缺少 using 指令或程序集引用?)    E:\张开能\C#\code\第二十三章\Test04\Program.cs    27    40    Test04
                //(2)此处,由于item为T类型,系统无法确定其类型,因此无法确定这个类型是否包含name成员,因此出错
                //这时候,使用类型约束(关键字 where T :+限制的范围)where T: Aniamal即可将T限制在Aniamal及其子类中,就可以知道T类型,因此就不会出错了
            }
        }

    }

    class Aniamal
    {
      public  string name;
    }
时间: 2024-10-15 01:03:57

扣响C#之门笔记--第二十三章的相关文章

扣响C#之门笔记-第十九章

19.1 sting 类 sting 类的基础用法: (1).NET为sting设计了索引器,因此可以像数组那样访问字符串: (2)Length属性表示字符串长度(是string类唯一的属性) (3)"="运算符将元字符串的引用,传递给目标字符串,从而使两个变量指向同一个字符串: (4)字符串不可改变,当我们改变字符串的值时,系统会为字符串重新分配引用空间,并将值放进去:(因此不会影响原引用地址的内容) (5)string.Copy用于复制字符串内容,(直接复制值,非引用地址) (6)

扣响C#之门笔记-第九章

9.1 继承的概念 继承: 基类(父类) 派生类(子类) 派生类中自动拥有了父类的定义的变量和函数,每个派生类也可以成为其他新派生类的父类: 9.2 由父类派生子类 1.继承的语法: eg class Animal //(1)定义父类 { public double weight; private double temperature; public Animal() { weight = 0; temperature = 0; } public void eat() { Console.Wri

扣响C#之门笔记-第八章

8.1 以对象为成员 1.类的成员不光是可以使int,double等基本类型,也可以是其他类的对象: class Program { static void Main(string[] args) { date d = new date(1992, 5, 18, new Time(12, 20, 5)); } } class date { int year; int month; int day; Time t; //(1)含有其他对象成员的类 public date(int year, int

扣响C#之门笔记-第十章

10.1派生类的对象和基类的关系 (1)is A 关系(属于关系): 对象是属于类的,因此对象和类是属于关系:子类是属于父类的,因此子类和父类是属于关系: 因为:对象属于类,所以子类对象属于子类: 又因为:子类属于父类,所以子类对象属于父类 10.2 多态的概念 (1)引用符与对象 对象:对象是实存放对象实体的,是存储在堆中: 引用符:引用符中存放的是对象在堆中的地址,是存放在栈中: 有前面理论:子类对象属于父类,所以父类引用符可以指向子类对象: 也即是说: (a)子类实例(引用,对象)可以赋值

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

Gradle 1.12用户指南翻译——第二十三章. Java 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

第二十三章

曲则全,枉则正,洼则盈,敝则新,少则得,多则惑.是以圣人执一,为天下牧.不自视故彰:不自见故明:不自伐故有功:弗矜故能长.夫唯不争,故莫能与之争.古之所谓「曲则全」者,几语哉!诚全归之. 罗大伦道德经文字版-第二十三章1 暂时的隐忍会换来更多 各位朋友大家好,今天我们接着来聊<道德经>.我们今天聊到了第二十三章了,慢慢改变,这也说明改变已经很巨大了,我们一点点学.一点点提升,我与您一起往前走.其实我在讲<道德经>的过程中,我也在提升,我也在学习,我们一起来学习,三年之约,我们不见不

《C++ Primer》读书笔记—第十三章 控制拷贝

声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程 第III部分,类设计者的工具 1.类是C++的核心概念.每个类都定义了一个新类型和在此类型对象上可执行的操作. 2.当定义一个类时,我们显式或隐式地指定在此类型的对象的拷贝.移动.赋值和销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数(copy construcor),拷贝赋值运算符(copy-assignment operato

Java学习笔记—第十三章 数据库编程入门

第十三章 数据库编程入门 了解JDBC Java中对数据库的访问主要是通过JDBC进行的.JDBC是Java数据库连接技术(Java Database Connectivity)的简称,是用于执行SQL语句的API,可以为多种关系数据库提供统一访问.由一组用Java语言编写的类和接口组成.(SQL是Structure Query Language的缩写,意义为结构化查询语言,是一种标准的关系数据库访问语言.) JDBC的工作机制 使用JDBC完成对数据库的访问主要包括以下五个层次:Java应用程