C#学习(二)之基础杂谈

这周三晚上上了第二节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语句的使用也愈来愈少。以上不过是我这个新手菜鸟的一点想法,错漏之处,请各位老师大牛指正!拜谢!

 

以上是本次学习记录,初出茅庐,经验尚浅,错误之处不可避免,希望各位老师,同学,前辈大牛不吝赐教!

http://f.hiphotos.baidu.com/zhidao/pic/item/42a98226cffc1e17078acd7a4a90f603738de940.jpg

posted @ 2015-03-22 10:11  马列神教  阅读(391)  评论(1编辑  收藏  举报