博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#学习(二)之基础杂谈
阅读量:6311 次
发布时间:2019-06-22

本文共 2920 字,大约阅读时间需要 9 分钟。

这周三晚上上了第二节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

转载于:https://www.cnblogs.com/tjulym/p/4356794.html

你可能感兴趣的文章
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
人脸识别 开放书籍 下载地址
查看>>
Notepad++配置Python开发环境
查看>>
用户组概念 和 挂载 概念
查看>>
如何快速获取ADO连接字符串
查看>>
AspNetPager控件的最基本用法
查看>>
sessionKey
查看>>