C#基础加强_泛型的基本原理


 小弟初写博文,深感“易敲千行码,难下百余文”的道理。

内容粗略浅薄,望各位大神海涵!


  • 动态数组ArrayList可以实现不断的增长,让我们感受到了在某些地方较数组有优越感。但它包含的数组类型是object类,意味着需要转为数组时,存在拆装箱操作,这带来不必要的麻烦,也损失了性能。而List<T>泛型集合的出现便大大解决了上述问题。
            //泛型 --泛指某一个类型。这种类型需要用户自己确定List<string> lists = new List<string>();//添加元素lists.Add("aa");lists.Add("bb");//遍历元素时不用转换类型
foreach (string item in lists){Console.WriteLine(item);}lists[0] = "abcde";lists.RemoveAt(0);for (int i = 0; i < lists.Count; i++){Console.WriteLine(lists[i]);}Console.ReadKey();
  • 泛型集合在创建的时候就要求指定类型,所以在遍历集合或转数组时,直接就是数据的原有类型。其实我们也可以自己写个类似的类实现泛型集合的基本功能。
    //类的参数一般就是指类型参数class MyList<T>:{T[] items=new T[4];int count;// 集合中元素个数public int Count{get { return count; }//set { count = value; }
        } // 添加元素public void Add(T value){if (this.Count == items.Length){T[] newItems = new T[items.Length * 2];items.CopyTo(newItems, 0);items = newItems;}items[count] = value;count++;} // 索引器public T this[int index]{get{if (index < 0 || index >= this.Count){throw new ArgumentOutOfRangeException("no");}return items[index];}set{if (index < 0 || index >= this.Count){throw new ArgumentOutOfRangeException("no");}items[index] = value;}} 
  • 泛型直接通过<T>把元素的类型指定了,添加删除元素和动态数组类似。但是当我们用foreach遍历的时候,出问题了:
错误:“泛型的实现.MyList<int>”不包含“GetEnumerator”的公共定义,
因此 foreach 语句不能作用于“泛型的实现.MyList<int>”类型的变量。
  • 不包含GetEnumerator的公共定义?难道是要实现一个接口?通过反编译器查到 LIST<T>真的实现了名为“IEnumerable”的接口。
   public interface IEnumerable{[DispId(-4), __DynamicallyInvokable]IEnumerator GetEnumerator();}
  • 那我们就实现“IEnumerable”这个接口吧,再看IEnumerator,是一个接口对象,原来GetEnumerator()要求返回一个"IEnumerator"的接口对象。纠结了,哪里有这个对象啊。找不到,那我们自己写个类来实现这个接口,不就ok了。
    class MyEnumerator<T> : IEnumerator{T[] items;         //类型的数组int num;           //数组有效长度int index = -1;    //迭代指针默认在-1的位置//构造函数,public MyEnumerator(T[] items, int num){this.items = items;this.num = num;}//获取当前元素的值public object Current{get{return items[index];}}  //先判断有没有下一个元素,如果有就将枚举数推进到下一个元素public bool MoveNext(){index++;if (index >= num){return false;}return true;} #endregion// 迭代重置public void Reset(){index = -1;} }
  • 原来IEnumerator接口就是为了实现迭代功能的,foreach遍历的时候并不直接指向第0个元素,就像位置是在-1一样,先来判断有没有第0个元素,没有直接返回false,有则指针移到第0,再执行读取。有了实现IEnumerator的类,就可以new一个MyEnumerator<T>对象来return了。
        //IEnumerable 成员--实现迭代 public IEnumerator GetEnumerator(){//你必须得返回一个实现了IEnumerator接口的类对象return new MyEnumerator<T>(items, Count);}
  • 现在,MyList<T>也拥有List<T>的基本功能了哦,当然泛型还有很多其他的功能和特性,还有待我们去细细研究了。

 

 

转载于:https://www.cnblogs.com/lant-li/p/3843840.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python语法笔记(四)

1、对象的属性 python一切皆对象&#xff0c;每个对象都可能有多个属性。python的属性有一套统一的管理方案。 属性的__dict__系统 对象的属性可能来自于其类定义&#xff0c;叫做类属性&#xff1b;还可能是该对象实例自身定义的属性&#xff0c;叫做对象属性。类属性…

为什么闹钟设置了却不响_又被iPhone闹钟坑了?解决闹钟不响问题看这里!

原标题&#xff1a;又被iPhone闹钟坑了&#xff1f;解决闹钟不响问题看这里&#xff01;你有没有过这样的体验&#xff0c;早上醒来&#xff0c;闹钟还没响&#xff0c;内心想&#xff1a;真好&#xff0c;还可以再睡会。拿起手机想看看还能再睡多久&#xff0c;结果……我的天…

CSS3实现纸张边角卷起效果

html代码 1 <body>2 <div class"page">3 <div class"page-box">4 <h1>5 兔子先生6 </h1>7 <p>8 这几…

fzu 1894 单调队列

http://acm.fzu.edu.cn/problem.php?pid1894 Problem 1894 志愿者选拔Accept: 1328 Submit: 4200Time Limit: 1500 mSec Memory Limit : 32768 KB Problem Description 世博会马上就要开幕了&#xff0c;福州大学组织了一次志愿者选拔活动。参加志愿者选拔的同学们排队接…

均线带角度的指标_选股指标:均线角度并列向上,量能倍增飞扬趋势明显,短线操作可考虑...

今天要讲的是量能飞扬的选股指标&#xff0c;这个指标是按照20日、30日、60日、120日均线反正切角度原理为基础设计的公式&#xff0c;这4条均线角度排列向上&#xff0c;股价呈现向上的趋势&#xff0c;选出的股票有大概率上涨的空间&#xff0c;完整的公式如下&#xff1a;A2…

将链表中m-n范围内的数进行倒序

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

python 核心编程第5章(习题)

1.标准类型运算符. 写一段脚本&#xff0c;输入一个测验成绩&#xff0c;根据下面的标准&#xff0c;输出他的评分成绩&#xff08;A-F&#xff09;。 #coding:utf8 a raw_input() a int(a) if (a > 100) or (a < 0):print "输入错误,请输入0&#xff5e;100的数字…

cacti pdo_mysql_搭建配置cacti,采集信息监控

安装cactilamp环境[iyunvCacti ~]#service iptables stop //关闭防火墙服务[iyunvCacti ~]#chkconfig iptables off //永久性关闭[iyunvCacti ~]#vi /etc/sysconfig/selinux //把SELINUXenforcing改为SELINUXdisabled1&#xff1a;操作系统的安装&#xff0c;这个就不用写教程了…

win10下安装ubuntu14.04双系统(UEFI固件)

2019独角兽企业重金招聘Python工程师标准>>> 在windows10环境下安装双系统&#xff0c;遇到了很多坑。作为一个用惯了虚拟机的人&#xff0c;本想通过安装双系统来充分利用计算机本身的硬件资源&#xff0c;结果失败了n次&#xff0c;摸索了整整一天&#xff0c;看了…

时区缩写

新西兰标准时间 NZT 12:00 新西兰时间 AESST 11:00 澳大利亚东部夏时制 CST(ACSST) 10:30 中澳大利亚标准时间 CADT 10:30 中澳大利亚夏时制 SADT 10:30 南澳大利亚夏时制 EST(EAST) 10:00 东澳大利亚标准时间 GST 10:00 关岛标准时间 LIGT 10:00 澳大…

【python】内存相关

1. /proc/pid/status 可以查看进程相关的详细信息&#xff0c;当内存异常时可查看 参考&#xff1a;http://blog.csdn.net/beckdon/article/details/48491909 2. top -p 进程号 实时查看进程相关内存 3. 内存调试 参考&#xff1a;http://blog.csdn.net/ybdesire/article/det…

Java反射xml数据类

我们做自己的自动化测试。遇到使用xml存储数据&#xff0c;然而&#xff0c;这些数据可以被封装成一个类。将数据传递。通过下面的实际例子&#xff0c;展示给大家。请欣赏。 第一步&#xff1a;xml数据存储将被使用 第二步&#xff1a;读取xml文件的方法 第三步&#xff1a;xm…

扫雷游戏制作学习过程

1. 扫雷游戏的构思&#xff1a; 设计为初级&#xff0c;中级&#xff0c;高级三个级别。 因此不妨设置为如下规格&#xff1a; 9x9 16x15和30x16 &#xff08;行&#xff0c;列&#xff09;规格不同地雷的数量也不同&#xff0c;分别为 10&#xff0c;40 &#xff0c;99 2.在…

jsp+mysql学生成绩管理系统_jsp+servlet+mysql学生成绩管理系统 javaweb成绩管理系统 - 下载 - 搜珍网...

压缩包 : c59896403d8d913d853f6c0910dc71.zip 列表jsp servlet mysql实现的学生成绩管理系统/jsp servlet mysql实现的学生成绩管理系统/2.txtjsp servlet mysql实现的学生成绩管理系统/jsp servlet mysql实现的学生成绩管理系统.docjsp servlet mysql实现的学生成绩管理系统/…

3.CM3内核架构-寄存器

一、寄存器的种类 转载于:https://www.cnblogs.com/nyqm/p/7954762.html

Oil Deposit

题目描述&#xff1a;The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. I…

Javascript错误处理与调试

错误处理 1 try-catch语句 ECMA-262第3版引入了try-catch语句&#xff0c;作为Javascript中处理异常的一种标准方式&#xff0c;基本的语句如下: try{// 可能发生错误的代码}chatch(error){// 在错误发生时怎么处理} 如果try块中的任何代码发生了错误&#xff0c;就会立即退出代…

mysql 6.5.7_centos 6.5装mysql5.7

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼报错er-5.7.17-1.el7.i686 需要--> 处理依赖关系 libc.so.6(GLIBC_2.17)&#xff0c;它被软件包 mysql-community-server-5.7.17-1.el7.i686 需要--> 完成依赖关系计算错误&#xff1a;Package: mysql-community-client-5.7.…

201621123080《Java程序设计》第十一周学习总结

201621123080《Java程序设计》第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结多线程相关内容。 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读&#xff1a;多线程程序BounceThread 1.1 BallRunnable类有什么用&#…

Unix/Linux环境C编程入门教程(27) 内存那些事儿

calloc() free() getpagesize() malloc() mmap() munmap()函数介绍calloc&#xff08;配置内存空间&#xff09; 相关函数 malloc&#xff0c;free&#xff0c;realloc&#xff0c;brk表头文件 #include <stdlib.h>定义函数 void *calloc(size_t nmemb&#xff0c;size_t…