您的位置:知识库 »

[你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)

作者: Anytao  来源: 博客园  发布时间: 2008-09-12 13:28  阅读: 3493 次  推荐: 0   原文链接   [收藏]  
[1] [你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)
[2] [你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)

系列文章导航:

[你必须知道的.NET] 开篇有益

[你必须知道的.NET] 第一回:恩怨情仇:is和as

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

[你必须知道的.NET] 第四回:后来居上:class和struct

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

[你必须知道的.NET] 第九回:品味类型---值类型与引用类型(中)-规则无边

[你必须知道的.NET] 第十回:品味类型---值类型与引用类型(下)-应用征途

[你必须知道的.NET] 第十一回:参数之惑---传递的艺术(上)

[你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)

[你必须知道的.NET] 第十三回:从Hello, world开始认识IL

[你必须知道的.NET] 第十四回:认识IL代码---从开始到现在

[你必须知道的.NET] 第十五回:继承本质论

[你必须知道的.NET] 第十六回:深入浅出关键字---using全接触

[你必须知道的.NET] 第十七回:貌合神离:覆写和重载

[你必须知道的.NET] 第十八回:对象创建始末(上)

[你必须知道的.NET] 第十九回:对象创建始末(下)

[你必须知道的.NET]第二十回:学习方法论

[你必须知道的.NET]第二十一回:认识全面的null

[你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考

[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二


因此执行结果就可想而知,我们从分析过程就可以发现string作为引用类型,在按值传递过程中和其他引用类型是一样的。如果需要完成ChangeStr()调用后,改变原来str的值,就必须使用ref或者out修饰符,按照按引用传递的方式来进行就可以了,届时aStr = "Changing String"改变的是str的引用,也就改变了str的指向,具体的分析希望大家通过接下来的按引用传递的揭密之后,可以自行分析。

  4.3 按引用传递之ref和out

  不管是值类型还是引用类型,按引用传递必须以ref或者out关键字来修饰,其规则是:

  • 方法定义和方法调用必须同时显示的使用ref或者out,否则将导致编译错误;

  • CRL允许通过out或者ref参数来重载方法,例如:  

Code

 

  当然,按引用传递时,不管参数是值类型还是引用类型,在本质上也是相同的,这就是:ref和out关键字将告诉编译器,方法传递的是参数地址,而不是参数本身。理解了这一点也就抓住了按引用传递的本质,因此根据这一本质结论我们可以得出以下更明白的说法,这就是:

  • 不管参数本身是值类型还是引用类型,按引用传递时,传递的是参数的地址,也就是实例的指针。

  • 如果参数是值类型,则按引用传递时,传递的是值类型变量的引用,因此在效果上类似于引用类型参数的按值传递方式,其实质可以分析为:值类型的按引用传递方式,实现的是对值类型参数实例的直接操作,方法调用方为该实例分配内存,而被调用方法操作该内存,也就是值类型的地址;而引用类型参数的按值传递方式,实现的是对引用类型的“值”引用指针的操作。例如:   

Code

  如果参数是引用类型,则按引用传递时,传递的是引用的引用而不是引用本身,类似于指针的指针概念。示例只需将上述string传递示例中的ChangeStr加上ref修饰即可。 

  下面我们再进一步对ref和out的区别做以交代,就基本阐述清楚了按引用传递的精要所在,可以总结为:

  • 相同点:从CRL角度来说,ref和out都是指示编译器传递实例指针,在表现行为上是相同的。最能证明的示例是,CRL允许通过ref和out来实现方法重载,但是又不允许通过区分ref和out来实现方法重载,因此从编译角度来看,不管是ref还是out,编译之后的代码是完全相同的。例如:

Code
编译器将提示: “ShowInfo”不能定义仅在 ref 和 out 上有差别的重载方法。 

  • 不同点:使用的机制不同。ref要求传递之前的参数必须首先显示初始化,而out不需要。也就是说,使用ref的参数必须是一个实际的对象,而不能指向null;而使用out的参数可以接受指向null的对象,然后在调用方法内部必须完成对象的实体化。

  5. 结论

  完成了对值类型与引用类型的论述,在这些知识积累的基础上,本文期望通过深入的论述来进一步的分享参数传递的艺术,解开层层疑惑的面纱。从探讨问题的角度来说,参数传递的种种误区其实根植与对值类型和引用类型的本质理解上,因此完成了对类型问题的探讨再进入参数传递的迷宫,我们才会更加游刃有余。我想,这种探讨问题的方式,也正是我们追逐问题的方式,深入进入.NET的高级殿堂是绕不开这一选择的。

                        ©2007 Anytao.com

[第1页][第2页]
0
0
标签:.NET 参数 传递

热门文章

    最新文章

      最新新闻

        热门新闻