第四篇 函数

来源:互联网 发布:网络恶搞 编辑:程序博客网 时间:2024/05/17 05:09

1.使用函数的名称和参数定义函数的签名。

2.参数数组。

(1)C#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组。用params关键字定义它们。

static <returnType> <functionName> (<p1Type> <name>,...,params <type>[] <name>)

{

...

return <returnValue>;

}

调用时使用<functionName>(<p1>,...,<val1>,<val2>,...);

值得注意的是,这里同样可以传入一个数组,只能是一个数组,不能在数组前或后再加入单个变量。

3.引用参数和值参数。

引用参数的定义必须在变量类型之前加入ref关键字,函数调用时也必须加入ref关键字。

同时注意,用作ref参数的变量的两个限制。(1)参数必须是非const的。(2)必须使用初始化过后的变量。

4.输出参数。

除了使用引用之外,还可以使用out关键字来指定输出参数。out关键字和ref关键字使用相同,都必须在函数定义和函数调用用作参数的修饰符。

注意:(1)可以把为赋值的变量用作out参数,同时out参数必须看做是未赋值的。(在函数体内,对为赋值的out参数进行输出操作会出错。)

    (2)在函数体内,必须对out参数赋值。

5.变量的作用域。

(1)在控制台应用程序中,全局变量必须使用static或const关键字来定义。

(2)变量的作用域,这里和C++中有很大的区别。

c++中定义一个string类型,就相当于定义一个指针,指向堆中的内存,在不同的编译器中,这个指针的大小不同,vs下的编译器的字节大小为28.

然后,在C#中,定义一个string类型,就只是取了个名字,并没有分配具体的内存。所以就有了以下两种使用的情况:

①例,在循环外声明,未进行初始化,然后在顺环内对变量初始化。则退出顺环后,变量依然相当于未初始化。

②在顺环外声明并且初始化后,然后再在顺环中修改变量,则退出顺环后,变量为在顺环中修改后的值。

有点绕,书中给的这一段话比较好理解:只声明一个简单变量类型,并不会引起其他变化。只有在给变量赋值后,这个值才占用一块内存空间。如果,这种占用内存的行为在顺环中发生,则该值实际上定义为一个局部值,在顺环外部使用会超出其作用域。

因此,最好在声明和初始化所有变量后,再在代码块中使用它们。

6.函数的重载

这里有一点和C++不同的地方在于,值参数和引用参数方面。

C++引用参数,在函数调用时是不用使用&符号的,所以,对应也就没有值参数和引用参数两个版本。

C#因为其签名不同,且在函数顶用引用函数时,必须使用ref关键字。所以,对值参数和引用参数可以重载,且在调用时,根据是否有ref关键字来确定调用的是哪一个版本。

7.初始委托

委托(delegate)是一种可以把引用存储为函数的类型,有点绕。现在暂时将可以将委托理解为一种特殊的类型,委托的声明非常类似于函数,但是不带函数体,且需要使用delegate关键字。在定义了委托后,就可以声明该委托的类型,接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

注意:有了引用函数的变量后,还可以执行把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托来调用它引用的任何函数。

委托的声明:例:

delagate double ProcessDelegate(double param1, double param2);

定义委托变量:

ProcessDelegate process;

对委托进行初始化:

process =Multiply;

或者:process = new ProcessDelegate(Multiply);









原创粉丝点击