知识大全 C++转向C#要注意的几个变化
Posted 变量
篇首语:寸阳分阴须爱惜,休负春色与时光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C++转向C#要注意的几个变化相关的知识,希望对你有一定的参考价值。
C++转向C#要注意的几个变化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
引言
每隔 年左右 编程人员就需要花费大量的时间和精力去学习新的编程技术 在 年代是Unix和C 年代是Windows和C++ 现在又轮到了微软的 NETFramework和C # 尽管需要学习新的技术 但由此带来的好处却远高于付出的劳动 幸运的是 使用C#和 NET进行的大多数工程的分析和设计与在C++和Windows中没有本质的变化 在本篇文章中 我将介绍如何实现由C++到C#的飞跃
已经有许多文章介绍过C#对C++的改进 在这里我就不再重复这些问题了 在这里 我将重点讨论由C++转向C#时最大的变化 由不可管理的环境向可管理的环境的变化 此外 我还会提出一些C#编程人员容易犯的错误供大家参考 此外 还将说明一些C#语言的能够影响编程的新功能
转向可管理的环境
C++的设计目标是低级的 与平台无关的面向对象编程语言 C#则是一种高级的面向组件的编程语言 向可管理环境的转变意味着你编程方式思考的重大转变 C#不再处理细微的控制 而是让架构帮助你处理这些重要的问题 例如 在C++中 我们就可以使用new在栈中 堆中 甚至是内存中的某一特定位置创建一个对象
在 NET的可管理环境中 我们再不用进行那样细微的控制了 在选择了要创建的类型后 它的位置就是固定的了 简单类型(ints double和long)的对象总是被创建在栈中(除非它们是被包含在其他的对象中) 类总是被创建在堆中 我们无法控制对象是创建在堆中哪个位置的 也没有办法得到这个地址 不能将对象放置在内存中的某一特定位置 (当然也有突破这些限制的方法 但那是很另类的方法 )我们再也不能控制对象的生存周期 C#没有destructor 碎片收集程序会将对象所占用的内存进行回收 但这是非显性地进行的
正是C#的这种结构反映了其基础架构 其中没有多重继承和模板 因为在一个可管理的碎片收集环境中 多重继承是很难高效地实现的
C#中的简单类型仅仅是对通用语言运行库(CLR)中类型的简单映射 例如 C#中的int是对System Int 的映射 C#中的数据类型不是由语言本身决定的 而是由CLR决定的 事实上 如果仍然想在C#中使用在VisualBasic中创建的对象 就必须使自己的编程习惯更符合CLR的规定
另一方面 可管理的环境和CLR也给我们带来了好处 除了碎片收集和所有 NET语言中统一的数据类型外 它还提供给我们一个功能强大的面向组件的编程语言 无须对后期绑定提供特别的支持 类型发现和后期绑定都是被内置在语言中的 属性是C#语言中的第一类的成员 事件和代理也是
可管理环境最主要的优点是 NETFramework 尽管在所有的 NET语文中都可以使用这种框架 但C#可以更好地使用 NET框架中丰富的类 接口和对象
Traps
C#看起来与C++非常相似 这使得我们在由C++转向C#时比较轻松 但其中也有一些容易出错的地方 在C++中编写得非常漂亮的代码 在C#中会不能通过编译 甚至会出现意想不到的结果 C#与C++之间在语法上的变化并不大 编译器能够发现这二者之间大部分的差异 我在这里就不再多费笔墨了 在这里我介绍几个容易出问题的比较重要的变化
引用类型和值类型
在C#中 值类型和引用类型数据是有区别的 简单类型(int long double等)和结构属于值类型数据 类和对象属于引用类型数据 除非是包含在引用类型的变量中 与在C++中一样 值类型变量的值存储在栈中 引用类型的变量也存储在栈中 但它的值是一个存储在堆中的对象的地址 这一点也与C++类似 值类型变量是将自己的值传递给方法 而引用类型变量则将自己的指针传递给方法
结构 C#中的结构与C++中有非常明显的区别 在C++中 结构更象是类 除了缺省的继承外 其缺省的访问权限是public而不是private 在C#中 结构与类截然不同 它是用来封装轻型对象的 是值类型的数据类型 在传递时传送的是变量的值 而不是其地址 此外 它们也有一些不适用于类的限制 例如 它是不能继承的 也没有除System ValueType之外的基本类 结构还不能定义一个缺省的constructor
另一方面 由于结构比类的效率要高 因此它非常适合于创建轻型对象 因此 如果它的缺点对你的软件没有影响 使用结构比使用类效率要高得多 尤其是对于小对象而言 所有的一切都是对象 在C#中 所有的东西都是由继承Object得到的 包括创建的类和int structs等值类型的变量 Object类提供了一些有用的方法 例如ToString 使用ToString的一个例子是与System Console WriteLine一起使用 它可以接受一个字符串和许多对象 与使用printf语句不同 要使用WriteLine 需要提供代换变量 假设myEmployee是用户定义的Employee类的一个实例 myCounter是用户定义的Counter类的一个实例
Console WriteLine( Theemployee: thecountervalue: myEmployee myCounter);
其中的WriteLine会调用每个对象的Object ToString方法 替换作为参数返回的变量 如果Employee类不覆蓋ToString 就会调用缺省的实现(由System Object继承得到的) 它将把类的名字作为一个字符串返回 Counter会覆蓋ToString 返回一个整型的变量 因此 上面代码的输出为
Theemployee:Employee thecountervalue:
如果向WriteLine传递一个整型变量会发生什么情况呢?由于不能对整型变量调用ToString 编译器将自动将整型变量封装在一个对象的实例中 当WriteLine调用ToString时 对象就会返回表示整型变量值的字符串 下面的代码就说明了这个问题
类的使用
usingSystem; //不覆蓋ToString的类 publicclassEmployee //覆蓋了ToString的类 publicclassCounter privateinttheVal; publicCounter(inttheVal) this theVal=theVal; publicoverridestringToString() Console WriteLine( CallingCounter ToString() ); returntheVal ToString();
publicclassTester publicstaticvoidMain() //创建类的实例 Testert=new Tester(); //调用非静态成员 //(mustbethroughaninstance) t Run(); //演示调用ToString的非静态方法 publicvoidRun() EmployeemyEmployee=newEmployee(); CountermyCounter=newCounter( ); Console WriteLine( Theemployee: thecountervalue: myEmployee myCounter); intmyInt= ; Console WriteLine( Hereareointegers: and myInt);
引用型参数和输出型参数 与C++中相同 C#中的方法也只能有一个返回值 在C++中 我们通过将指针或索引作为参数而克服了这个限制 被调用的方法改变其中的参数 调用方法就可以得到新的值了
向方法中传递一个索引作为参数时 只能严格地按传递索引或指针所能够提供的方式访问原来的对象 对于值类型变量而言 就不能采用这种方法了 如果要通过引用型参数传递值型变量 就需要在其前面加上ref关健字 如下所示
publicvoidGetStats(refintage refintID refintyearsServed)
需要注意的是 既需要在方法的定义中使用ref关健字 也需要在对方法的实际调用中使用ref关健字
Fred GetStats(refage refID refyearsServed);
现在 我们可以在调用方法中定义age ID和yearsServed变量 并将它们传递给GetStats 得到改变后的值
C#要求明确的赋值 也就是说 在调用GetStats方法之前 必须对age ID和yearsServed这三个局部变量进行初始化 这一工作似乎有点多余 因为我们仅仅使用它们从GetStats中得到新的变量的值 为了解决这一问题 C#提供了out关健字 表示我们可以向方法中传递没有被初始化的变量 这些变量将通过引用变量的方式进行传递
publicvoidGetStats(outintage outintID outintyearsServed)
当然了 调用方法也必须作出相应的变化
cha138/Article/program/net/201311/13017相关参考
鱼鳞病患者经常会问:日常护理鱼鳞病要注意的几个方面?有些鱼鳞病患者自身症状较轻,只要通过正常的护理就能很好的控制病情。此时护理就会比临床治疗更为重要,那么这时多数鱼鳞病患者都不知道生活中怎么做才是对自
近年来,随着全国农机购置补贴项目的实施,各种新型农机产品也推向市场,广大农机户购买农机产品积极性高涨,而购买农业机械需要多年的积蓄,有的还要贷款或几方合作的形式,作为农业生产资料的投入,往往要用上好几
近年来,随着全国农机购置补贴项目的实施,各种新型农机产品也推向市场,广大农机户购买农机产品积极性高涨,而购买农业机械需要多年的积蓄,有的还要贷款或几方合作的形式,作为农业生产资料的投入,往往要用上好几
求职面试中的语言习惯除了个别特殊职业,很难说求职面试中存在有特殊的语言要求。语言是人类用以表达思想,进行社会交往的最基本的方式,而求职面试同其他社会交往一样,是以语言表达思维,互相沟通的社会行为,所以
C#与C++谁更强?还是关公战秦琼 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我一直不明白C
C#和C++结构体Socket通信 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近在用C#做
横向技术分析C#、C++和Java优劣 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C#诞生之
小麦种子质量包括种子水分、发芽率、发芽势、净度、纯度等。要提高种子质量,就要从小麦的原种种植、生育期管理、收割打碾、精选及保管贮藏等多方面综合管理和提高。1种子繁殖基地的选择种子繁殖基地要选择土壤耕性
小麦种子质量包括种子水分、发芽率、发芽势、净度、纯度等。要提高种子质量,就要从小麦的原种种植、生育期管理、收割打碾、精选及保管贮藏等多方面综合管理和提高。1种子繁殖基地的选择种子繁殖基地要选择土壤耕性
C++、Java与C#的命名规范总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 摘要由于在开