知识大全 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++谁更强

C#与C++谁更强?还是关公战秦琼  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我一直不明白C

知识大全 C#和C++结构体Socket通信

C#和C++结构体Socket通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近在用C#做

知识大全 横向技术分析C#、C++和Java优劣

横向技术分析C#、C++和Java优劣  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#诞生之

提高小麦种子质量应注意的几个环节

小麦种子质量包括种子水分、发芽率、发芽势、净度、纯度等。要提高种子质量,就要从小麦的原种种植、生育期管理、收割打碾、精选及保管贮藏等多方面综合管理和提高。1种子繁殖基地的选择种子繁殖基地要选择土壤耕性

提高小麦种子质量应注意的几个环节

小麦种子质量包括种子水分、发芽率、发芽势、净度、纯度等。要提高种子质量,就要从小麦的原种种植、生育期管理、收割打碾、精选及保管贮藏等多方面综合管理和提高。1种子繁殖基地的选择种子繁殖基地要选择土壤耕性

知识大全 C++、Java与C#的命名规范总结

C++、Java与C#的命名规范总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要由于在开