这周三晚上上了第二节C#,章老师详细介绍了C#的一些基础知识。因为大部分都和C++,JAVA等语言类似,所以此处不再赘述,只略微记录一下一些我自己认为比较重要,容易出错抑或与其他语言不大一样之处。
1.类型转换
在C#中,下列赋值语句: 值域大的变量 = 值域小的变量是可以通过编译的,而 值域小的变量 = 值域大的变量 这样的赋值语句是不能通过编译的。如下列代码:
1 short x=5;2 //赋值语句: 值域大的变量 = 值域小的变量;3 //编译可通过,y的值为5,隐式类型转换成功4 int y = x;
1 short x;2 int y = 500;3 //赋值语句: 值域小的变量 = 值域大的变量;4 //编译不能通过,无法完成隐式转换,编译器报错5 x = y ;
这是隐式类型转换方面,然而是可以通过显式类型转换达到 值域小的变量 = 值域大的变量 这样的效果的,如以下代码:
1 short x;2 int y = 500;3 //赋值语句: 值域小的变量 = 值域大的变量;4 //可以通过编译,显式转换成功,不过需要自己注意取值范围5 x =(short) y;
我认为这种处理方式是非常棒的,可以有效避免类型转换时取值溢出的问题,降低bug出现几率。
2.枚举类型
枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。默认情况下,枚举中每个元素的基础类型是int,也可以使用冒号指定另一种整数值类型,如下列代码:
1 enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };2 enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
如果不为枚举数列表中的元素指定值,则它们的值将以 1 为增量自动递增。在上面的示例中,Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推。创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。
如果变量 meetingDay 的类型为 Days,则只能将 Days 定义的某个值赋给它(无需显式转换)。如果会议日期更改,可以将 Days 中的新值赋给 meetingDay:
1 Days meetingDay = Days.Monday;2 //...3 meetingDay = Days.Friday;
经过实验我发现,实际上可以将任意整数值赋给 meetingDay。例如:
1 meetingDay = (Days)20
编译器不会报错,但我个人感觉实际开发中很有可能会导致未知的错误。
枚举变量输出也是一件非常好玩且易出错的,如下列代码:
1 Console.WriteLine(“Enumeration value { 0}”, Days.Sunday);2 Console.WriteLine(“Enumeration value { 0}”, (int) Days.Sunday);
其输出如下图:
是不是很好玩?
也就是说,枚举类型和整型之间的转换是需要显式(Explicitly)进行的,这一点十分重要,需要牢记。
另外,给枚举类型中某一个元素赋值的话也会影响后面元素的值,如修改Days代码如下:
1 enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday = 5, Saturday };
输出代码如下:
1 Console.WriteLine(“Enumeration value { 0}”, (int) Days.Friday);2 Console.WriteLine(“Enumeration value { 0}”, (int) Days.Saturday);
输出结果如下图:
可见没有特殊指定,中间改变某一元素的值,其后面的元素也是继续以1递增的。
3.Switch语句
C#中的switch语句与其他编程语言中有着微妙的不同,其主要体现在控制不能从一个case标签贯穿到另一个case标签,即一般情况下每个case后必须有一个break,default也不能例外。如下列代码所示:
1 //代码正确,有内容的case后都跟有break 2 int testme=3; 3 switch (testme) 4 { 5 case 2: 6 case 3: 7 testme = 1; 8 break; 9 default:10 testme = 1;11 break;12 }
1 int testme=3; 2 switch (testme) 3 { 4 case 2: 5 testme = 5;//错误!后面没跟break,无法通过编译! 6 case 3: 7 testme = 1; 8 break; 9 default:10 testme = 1;//错误!后面没跟break,无法通过编译!11 12 }
不过在C#中可以通过goto语句替代break,如下列代码:
1 int testme=3; 2 switch (testme) 3 { 4 case 2: 5 testme = 5; 6 goto case 3;//正确!转到case3的情况,不用再加break,可通过编译 7 case 3: 8 testme = 1; 9 break;10 default:11 testme = 1;12 break;13 }
不过C#中没下列用法,需要注意:
1 int testme=3; 2 switch (testme) 3 { 4 case 2 to 10://错误!无此用法,不能通过编译 5 testme = 1; 6 break; 7 case Is > 10://错误!无此用法,不能通过编译 8 default: 9 testme = 1;10 break;11 }
我个人感觉C#关于switch这方面的设计有些不太好,既然每个case后都必须加break,那为何还要在switch语句保留break关键字?而且case不能连贯,也不某些特殊情况下的需要连贯的程序设计。虽然有goto语句使其看起来更加灵活,但goto语句会让程序变得晦涩难懂,而且极易出现难易预估的错误,现今对与goto语句的使用也愈来愈少。以上不过是我这个新手菜鸟的一点想法,错漏之处,请各位老师大牛指正!拜谢!
以上是本次学习记录,初出茅庐,经验尚浅,错误之处不可避免,希望各位老师,同学,前辈大牛不吝赐教!