`
java-mans
  • 浏览: 11386761 次
文章分类
社区版块
存档分类
最新评论

C++ VS C#(3):switch,类型转换

 
阅读更多

//=====================================================================
//TITLE:
// C++ VS C#(3):switch,类型转换
//AUTHOR:
// norains
//DATE:
// Tuesday 1-December-2010
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================

1.switch

C++和C#都有switch关键字,只不过,两者间还是有一定的区别的。最大的区别就是,在C#中,如果case之后有语句,那么必须要以break跳出switch。简单点来说,下面这个语句虽然在C++中是一切正常,但在C#中却是无法编译通过的:

C#中会提示错误:error CS0163: Control cannot fall through from one case label ('case 2:') to another。也就是说,“case 2:”不能穿越到“case 3:”。那么,是不是意味着“case 2:”和“case 3:”无法执行同一代码呢?答案当然不是,其实只要“case 2:”和“case 3:”之间没语句即可:

更改之后的代码能够顺利在C#中顺利编译通过。通过这个例子可以知道,switch在C++中灵活性高,在C#则是安全性强——毕竟忘记写break的还是大有人在。

C#对switch还有一个改进之处在于,判定条件可以采用字符串,比如:

这个代码段不能在C++中编译通过,但在C#中却是一切正常,因为在C++中,判定的条件一定要为数值类型。这也是没办法的事情,字符串在C#中是一个标准的内置类型,但在C++却是STL衍生的一个类。


2.类型转换

这两种语言在类型转换上都有两种方式,分别是隐式转换和显式转换。这里有个小细节需要注意,在C#中,凡是能够进行隐形转换的,数值都是无损的。这样说起来可能有点拗口,我们来看看这段代码:

这个代码在给nVal赋值时有个隐式转换,也就是将int转为byte,除非iVal的数值在于0~255,否则肯定会精度丢失。在C++中,该代码却能够进行编译,不过在C#中就遭遇失败,提示错误:error CS0266: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)。

如果非要将int类型赋值给byte,C#中一定要进行显式转换转换,如:

这时候C#的表现就和C++的一致,即使精度丢失,也会完成转换。不过C#还留了一手,可以在转换前增加checked来进行检查,如:

当iVal的实际数值在byte类型的允许范围之内,则一切都没有问题;但如果范围超出,则会弹出一个提示对话框,告诉你数据溢出,如:


对于C++来说,这种以括号形式进行转换的称为旧方式,并不建议程序员使用。取而代之的是static_cast,reinterpret_cast,const_cast和dynamic_cast。说点题外话,我觉得对于编译器而言,特别是在嵌入式系统领域,最难实现的应该是dynamic_cast。最典型的例子就是,你使用RVDS,带有dynamic_cast的代码是无法编译通过的,但在MDK里却是一帆风顺。

那么C#呢,是否也有类似的XXX_cast?答案是否定的。C#另辟蹊径,可以使用Convert对象。该对象的方法有很多,比如. ToByte,ToInt16等等。那为什么会有括号转换的方式,又有对象函数的方式呢?理由很简单,括号转换是属于C#的,对象函数是属于.Net Framework的。换句话来说,对象函数的方法,不仅适合C#,也适合VB,以及一切运行于.Net Framework上的语言。除此以外,这两种方式还有一个很重要的区别,括号转换方式只能在数值中进行转换,但对象函数却能在大部分类型间进行,如:

但字符串转换为数值,有一点必须要注意,就是字符串的内容必须符合数值的格式,否则会出错。比如,有如下代码段:

执行Convert之后,会提示错误,如图:

分享到:
评论

相关推荐

    在一小时内学会 C#(txt版本)

    注意:C# 的类型范围和 C++ 不同。例如:long 在 C++ 中是 4 字节而在 C# 中是 8 字节。bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构...

    c#学习笔记.txt

    装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中。关键字 object. 取消装箱是从 object 类型到值类型或从接口类型到实现该...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    脑力保健 微软,GOOGLE等试题试做 C#版

    现网络上,此类题目的求解多以C,C++为主,面C#代码鲜见. 附件为本人以C#版控制台程序对各试题的求解,希望大家 相互学习,以抛砖引玉. 例如: 微软 在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    2.6 类型转换和类型强制转换 64 2.6.1 赋值语句中的类型转换 65 2.6.2 显式类型转换 65 2.6.3 老式的类型强制转换 66 2.7 AUTO关键字 66 2.8 查看类型 67 2.9 按位运算符 67 2.9.1 按位AND运算符 68 2.9.2 ...

    C#语法相比其它语言比较独特的地方(三)

    3.as和is只会检测待转化类型的类型,而不会进行其它操作,所以只有当转化类型是目标类型或者目标类型的子类(当然如果目标类型是接口,并且待转化类型实现了该接口也可以)才能转换成功. 强制转化,会调用系统定义(比如...

    C#实现根据数字序号输出星期几的简单实例

    本文以实例代码实现了C#根据数字序号输出星期几,用户可通过输入数字0~6,输出星期各天的英语单词,程序中主要是演示if语句和switch语句的用法,当然其中的英文可以改成中文。 具体实现代码如下: //Select.cs程序...

    C程序设计语言(第2版·新版中文)

    2.7 类型转换 2.8 自增运算符与自减运算符 2.9 按位运算符 2.10 赋值运算符与表达式 2.11 条件表达式 2.12 运算符优先级与求值次序 第3章 控制流 3.1 语句与程序块 3.2 if-else语句 3.3 else-if语句 3.4 ...

    asp.net知识库

    多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. ...

    【。net 专业】 面试题

    委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息...

Global site tag (gtag.js) - Google Analytics