您的位置:首页 > 编程语言 > C#

用《叩响C#之门》复习C#基础知识 第六章 函数 (本章原文有两处欠妥,需要注意)

2009-10-13 23:11 405 查看
函数主要定义在主函数之外,和主函数并列,因为它们本质上都是函数。

函数的执行过程

C#程序以主函数Main()为入口,逐条执行主函数中的代码,当遇到其他函数时,就转而去执行其他函数的代码;执行完后将结果返回主函数,继续执行主函数中剩余的代码,执行完主函数中所有代码后,整个程序就终止了。

函数的命名方式

.NET推荐采用PascalCasing形式为函数命名,即所有单词的首字母都大写。

 

1、返回值

如果在函数A()中调用函数B(),则函数A()称为主调函数,函数B()称为被调函数。

return语句需要注意:

1)返回值的类型要和函数定义中的返回类型一致,或者返回值的类型可以隐式转化为函数的返回类型。

2)可以用return语句直接返回表达式

3)函数可以没有返回值,这时函数的返回类型为void。

4)函数中可以有多个return语句,先执行到哪个return语句,哪个return语句便起作用,返回主函数,起作用的return语句后面的所有语句都忽略不计,不被执行。

 

2、值传递

函数定义中的参数称为形式参数(简称形参),定义函数时必须指明形参的类型。

调用函数时的参数称为实际参数(简称实参),它可以是常量、变量(变量中当然也包括对象,对象也可看成变量,是引用型变量)或表达式,实参和对应的形参必须类型相同或兼容。

在调用函数时,发生了从实参到形参的数据传递,程序首先为形参分配内存空间(值类型变量名的形参在栈中分配内存的字节空间,引用类型变量名(又叫引用,实际上,对象是引用型变量,而参数中的那些声明名称都为引用,或叫引用符)的形参在栈中分配一个存储对象在堆中的首地址(32位系统应该是4个字节)),并把实参的值复制一份给形参(值类型变量实参将值直接复制给形参,引用类型变量实参是将对象在堆中的首地址复制给形参)。

针对值类型变量形参的情况,这种参数传递方式称为值传递,此时,实参和形参是互不相同的变量,在内存中占据不同的空间,当值传递完成后,它们便是互不相关的量,形参的变化不会影响实参。

针对引用类型变量形参的情况,这种参数传递方式实际上就是变量的地址传递,传递的其实就是对象的引用。

 

3、地址传递

书中原表述有点欠妥,此部分应该也归为值传递,分析已在上篇随笔说明。

 

4、引用参数(ref)由上篇随想小结如下:

1)ref后面跟值类型时,传递的是值类型的地址

2)ref后面跟引用类型时,传递的是对象的引用符的地址!即对象的引用的引用,或者称指针的指针

 

5、输出型参数(out)

如何能将更多的数据返回到主调函数中呢?引用型参数ref能改变实参的值,将多个计算结果反馈到主调函数中。除此之外,还可用输出型参数(out)返回有用的计算结果。out型参数和ref型参数用法差不多,区别如下:

1)ref型参数使用前,实参必须赋值;

2)out型参数使用前不能赋值,即使赋值了,也会被忽略。

也就是说,使用ref参数传递前,必须将对象(包括值类型,值类型只有在赋值以后,才能在内存的栈中划出一块区域存放值类型变量)初始化,使ref参数指向一个实际的对象,而不是null;而out参数是可以指向null的。

 

6、参数匹配

实参和形参的类型应当匹配,如果不匹配,编译器将尝试进行隐式转化,把实参提升到形参的类型。在过去的学习笔记中有此感触。

 

7、变量的作用域

在函数内部定义的变量,只在该函数内部有效,它的作用域从定义的地方开始,直至函数结束为止,当调用函数时,变量在内存中创立,当退出函数时,变量从内存中清除,因此称局部变量,形式参数也是局部变量,同一函数中的变量不能同名,但不同函数中的变量可以同名。有时,会在函数内部的程序块中定义变量,这些变量只在定义它的程序块中有效。程序块内和程序块外定义的变量都不能重复!

 

第二个欠妥处:原文中“如果程序块中定义的变量和程序块外的变量同名,在程序块中,只有内部的变量有效,外部的同名变量被屏蔽。”在试验中表明是错的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: