【C#学习】从泛型集合到强制转换,start brain storm~


        大话设计模式的时候,提到了一个迭代器模式,由于高级语言对迭代器模式功能进行了很好的封装,所以这个模式就不太常用。不过,我想说的重点是,迭代器模式里提到的一个概念“非泛型集合”。由于不明白什么意思,于是我就去问了度娘。不过我发现“泛型集合”比非泛型集合更有料。

 
泛型集合

        泛型集合就是泛泛的集合,不确定的类型的集合。好吧,这个答案给的太精辟,找了很多资料还是没有很通俗的理解。小编了解的到的有 ListDictionary 两个属于泛型结合。ArrayListHashtable 两个属于非泛型集合。

(关于它们四位侠客的博客,请戳【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#视频里讲过强制转换的概念,但是自己还是理解不是很好,于是乎,再把知识回顾一下吧。

 

强制转换

定义:程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换(强制转换)。

转换前提:数据类型兼容

目的:

强制类型转换的目的是使表达式的值的数据类型发生改变,从而使不同类型数据之间的运算能够进行下去。

 

强制转换的3种办法:

举个栗子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就是后门接受面包的地方。怎么样,这样解释是不是就清晰一些了。如果你不想用这种方法,下面还为你准备了一种~

 

举个栗子3int.tryParsestrings,out int resultstring转换为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。其实我一开始真的只是打算写写泛型、拆箱装箱那一点点浅浅的认识而已。

       这篇博客的经历了补充又补充,从一个点,到另一点,再到另外一个点。就像一次头脑风暴。只有去实践一次,你才能真正的体会到:知识不是孤岛,找到联系,知识于你就是一片无垠的大陆。

新知识的学习建立在旧知识之上,知识节点相互联系,这,就是在构建你的知识网。

以上知识为个人理解,如有偏颇,请各位尽情指正。

 

 【C#学习】从泛型集合到强制转换,start brain storm~_第1张图片

 

 

 


你可能感兴趣的:(C#)