大话设计模式的时候,提到了一个迭代器模式,由于高级语言对迭代器模式功能进行了很好的封装,所以这个模式就不太常用。不过,我想说的重点是,迭代器模式里提到的一个概念“非泛型集合”。由于不明白什么意思,于是我就去问了度娘。不过我发现“泛型集合”比非泛型集合更有料。
泛型集合就是泛泛的集合,不确定的类型的集合。好吧,这个答案给的太精辟,找了很多资料还是没有很通俗的理解。小编了解的到的有 List,Dictionary 两个属于泛型结合。ArrayList,Hashtable 两个属于非泛型集合。
(关于它们四位侠客的博客,请戳【C#学习】Arraylist Hashtable List Dictionary 对比总结)
1.类型更安全,只包含我们指定的类型。
2.大幅减少了构建自定义结合类型的需要 (只有类、结构、接口和委托可以使用泛型,枚举类型不可以。)
——什么是枚举?
答:就像一周有周一到周日七天,周日就是一个枚举。一年有1月到12月有12个月。2月就是一个枚举。
事先考虑到某一变量可能取的值(周一到周日),尽量用自然语言中含义清楚的单词来表示(sunmon tue)它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称枚举类型( day type)。
3.提供了更好的性能,不会导致装箱或拆箱的损耗
到这第三点,感觉更糊涂了。什么是拆装箱啊?小编记得在C#视频了也有提到,看大家的博客评论的时候也有看到,于是知识点和知识点之间的联系这么就来了,一张小知识网就构建ing。
装箱——是值类型转成object引用类型,装进去。
拆箱——是已被装箱的引用类型转成原来的值类型。拆开,拿出来。
装箱和取消装箱使值类型能够被视为对象。把int类型,object类型作为对象看待了。
namespace拆箱装箱 { class Program { static void Main(string[] args) { //装箱,int 类型变成object引用类型 int num = 10; object obj = num; Console.WriteLine(obj); Console.ReadKey(); //拆箱 已经被装箱的obj引用类型转换为int类型 int num = 10; object obj = num; int number =(int)obj;//强制转换 Console .WriteLine (number ); Console .ReadKey (); } } }
非泛型集合要进行拆装箱来进行取值赋值。而拆装箱的损耗体现在,不同类型数据转换期间会有资源的损耗,会造成运行速度的下降。所以尽量使用泛型集合,减少非泛型集合的使用。
以上的代码注释里提到了,强制转换,听着耳熟。哦,想起来了,C#视频里讲过强制转换的概念,但是自己还是理解不是很好,于是乎,再把知识回顾一下吧。
定义:程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换(强制转换)。
转换前提:数据类型兼容
强制类型转换的目的是使表达式的值的数据类型发生改变,从而使不同类型数据之间的运算能够进行下去。
举个栗子1:加()进行转换。如double类型的数据要想转换为 int类型的数据。
//强制转换 double num1= 555.5; //double想转换为int,就在num1前加(),括号里写想转换成为的数值类型--- int 。 int num =(int)num1; Console.WriteLine(num);//输出结果,555 Console.ReadKey();
举个栗子2:使用convert转换,想使用什么类型就to什么类型。
//强制转换 convert Console.WriteLine ("输入你的语文成绩"); stringstrChinese = Console.ReadLine();//使用了字符串数据类型,来接收用户的语文成绩 Console.WriteLine("输入你的英语成绩"); stringstrEnglish = Console.ReadLine(); //但只有数字类型才可以计算成绩。 int chinese = Convert.ToInt32(strChinese);//字符串类型 strChinese 转换成int类型 int English= Convert.ToInt32(strEnglish); int sum =English + chinese; Console .WriteLine ("总成绩为{0}",sum ); Console.Read();
intchinese = Convert.ToInt32(strChinese); string类型强制转换为int类型。拥有面粉的人想吃面包,他就需要一个工厂。而里面的convert就像一个工厂,(strChinese)就像面粉,int Chinese就是后门接受面包的地方。怎么样,这样解释是不是就清晰一些了。如果你不想用这种方法,下面还为你准备了一种~
举个栗子3:int.tryParse(strings,out int result)string转换为int类型字,和 convert 类似
Console.WriteLine("请输入您的年龄"); string strNum = Console.ReadLine(); //用户输入的也许是"18" 也许是 "lululu" int age =0; //要把字符串转换为int类型 bool result = int.TryParse(strNum, out age); //方法返回值是bool类型,或者说int.TryParse要用bool类型变量来接收 if(result) { Console.WriteLine(age); //输入"18",result 为 true,输出age 18 } else { Console.WriteLine("您输入的内容无法转换成数字"); //输入"lululu" ,result 为false,输出此句话 }
执行算术运算时,低类型(短字节)可以转换为高类型(长字节)
例如:int型转换成double型,char型转换成int型等等;
举个栗子: int类型可以隐式转换为 double类型。
//隐式转换 int number2 = 200; double number1 = number2; Console.WriteLine(number1);//F11调试的时候,number显示 200.0,但是F5运行完毕就是200,疑问?? Console.ReadKey();
从迭代器模式的非泛型集合,到泛型集合,从泛型集合再到拆箱,装箱,再到强制转换。
因为自己对一些知识的理解不足,所以需要用B解释A的时候,往往,我还要在找C去帮我理解B。其实我一开始真的只是打算写写泛型、拆箱装箱那一点点浅浅的认识而已。
这篇博客的经历了补充又补充,从一个点,到另一点,再到另外一个点。就像一次头脑风暴。只有去实践一次,你才能真正的体会到:知识不是孤岛,找到联系,知识于你就是一片无垠的大陆。
新知识的学习建立在旧知识之上,知识节点相互联系,这,就是在构建你的知识网。
以上知识为个人理解,如有偏颇,请各位尽情指正。