一周学会 C# (函数二)
C# 才鸟(QQ:249178521)
4. 引用型参数
· ** 引用型参数是实参的一个别名 ** ** **
w ** 没有发生复制 ** ** **
w ** 实参必须预先被赋值 ** ** **
w ** 实参必须是一个变量类型 ** ** **
w ** 实参和函数参数都要有 ** ** ref **
** sealed class ** ** ParameterPassing **
** { ** ** **
** static void ** ** Method( ** ** ref ** ** ** ** int ** ** parameter) **
** { **
** parameter = 42; **
** } **
** static void ** ** Main ** ** () **
** { **
** ** ** int ** ** arg = 0; **
** ** ** Console.Write(arg); // ** ** 结果为 ** ** 0 **
** Method( ** ** ref ** ** arg); **
** Console.Write(arg); // ** ** 结果为 ** ** 42 **
** } **
** } **
函数参数有 ref 修饰符时,被称为 引用型参数。引用型参数不产生新的存储区间。实际上,引用型参数是函数调用时所传递的实参所代表的变量的别名。结果是引用型参数只是实参所代表的变量的另一个名字。
ref 修饰符必须同时出现在函数声明语句和函数调用语句中。
只有被预先赋值的实参才能被传递给引用型参数,例如:
int arg; // arg 没有被赋初值
Method(ref arg);// 错误,实参必须预先赋初值
传递给 引用型参数的实参必须是变量类型,而不能是纯粹的值或常量。
Method(ref 42); // 错误,引用型参数的实参不能是纯粹的值
const int arg = 42;
Method(ref arg); // 错误,引用型参数的实参不能是常量
5.out 型参数
· ** out ** ** 型参数是实参的一个别名 ** ** **
w ** 没有发生复制 ** ** **
w ** 实参不必预先赋值 ** ** **
w ** 实参必须是变量类型 ** ** **
w ** 函数参数必须被预先赋值才能使用 ** ** **
w ** 实参和函数参数都要有 ** ** out **
** sealed class ** ** ParameterPassing **
** { ** ** **
** static void ** ** Method( ** ** out ** ** ** ** int ** ** parameter) **
** { **
** parameter = 42; **
** } **
** static void ** ** Main ** ** () **
** { **
** ** ** int ** ** arg; **
** //Console.Write(arg); **
** Method( ** ** out ** ** arg); **
** Console.Write(arg); // ** ** 结果为 ** ** 42 **
** } **
** } **
函数参数有 out 修饰符时,被称为 out 型参数。 out 型参数不产生新的存储区间。实际上, out 型参数是函数调用时所传递的实参所代表的变量的别名。结果是 out 型参数只是实参所代表的变量的另一个名字。
out 修饰符必须同时出现在函数声明语句和函数调用语句中。
没有被预先赋值的实参能够被传递给引用型参数,例如:
int arg; // arg 没有被赋初值
Method(out arg);// 正确,实参可以不赋初值
传递给 out 型参数的实参必须是变量类型,而不能是纯粹的值或常量。
Method(out 42); // 错误, out 型参数的实参不能是纯粹的值
const int arg = 42;
Method(out arg); // 错误, out 型参数的实参不能是常量
6.in 型参数 ?
· **_ readonly _ ** ** , const ** ** 和 ** ** _ in _ , ** ** 都是 ** ** C# ** ** 关键字 ** ** **
w ** 它们不能被用于函数参数 ** ** **
w **_ ref/out _ ** ** ** ** 型参数总是被赋于写的权力 ** ** ** ** **
7. 函数重载
· ** 一个类中的函数可以有同一个名字,称为重载 ** ** **
w ** 函数名和参数称为标识 ** ** **
w ** 标识必须唯一 ** ** **
w ** 返回值类型不是标识 ** ** **
** namespace ** ** System **
** { ** ** **
** public sealed class ** ** Console **
** { ** ** **
** public static void ** ** WriteLine() **
** { ... } **
** public static void ** ** WriteLine( ** ** int ** ** value) **
** { ... } **
** public static void ** ** WriteLine( ** ** double ** ** value) **
** { ... } **
** ... **
** public static void ** ** WriteLine( ** ** object ** ** value) **
** { ... } **
** ... **
** } **
** } **
和 C++ 与 Java 一样, C# 允许一个类声明两个以上的同名函数,只要参数的类型或个数不同。这就是重载。但是,一个类不能包含标识为相同的实例函数和静态函数,例如:
sealed class Illegal
{
void Overload() { ... }
static void Overload() { ... }// 错误
}
和 C++ 与 Java 一样,返回值的类型不是标识的一部分,不能被用作重载的标准,例如:
sealed class AlsoIllegal<o:p