一周学会 C# (函数三)
C# 才鸟(QQ:249178521)
8.ref/out 重载
· **_ ref _ ** ** / out ** ** 在大部分情况下是标识的一部分 ** ** ! **
w ** 你可以重载一个 ** ** ref ** ** 型参数和一个普通参数 ** ** **
w ** 你可以重载一个 ** ** out ** ** 型参数和一个普通参数 ** ** **
w ** 你不可以重载一个 ** ** ref ** ** 型参数和一个 ** ** out ** ** 型参数 ** ** **
** sealed class ** ** Overloading **
** { ** ** **
** void ** ** Allowed( ** ** int ** ** parameter) **
** { ... } **
** void ** ** Allowed( ** ** ref int ** ** parameter) **
** { ... } **
** // ** ** 正确,重载一个 ** ** ref ** ** 型参数和一个普通参数 ** ** **
** void ** ** AlsoAllowed( ** ** int ** ** parameter) **
** { ... } **
** void ** ** AlsoAllowed( ** ** out int ** ** parameter) **
** { ... } **
** // ** ** 正确,重载一个 ** ** out ** ** 型参数和一个普通参数 ** ** **
** void ** ** NotAllowed( ** ** ref ** ** ** ** int ** ** parameter) **
** { ... } **
** void ** ** NotAllowed( ** ** out int ** ** parameter) **
** { ... } **
** // ** ** 错误,不能重载一个 ** ** ref ** ** 型参数和一个 ** ** out ** ** 型参数 **
** } **
ref 和 out 修饰符可以是一个函数的标识。但是你不能同时重载 ref 和 out 型参数。 ref 和 out 修饰符在某种意义上是“安全的“,因为只有 ref 型实参才能传递给 ref 型函数参数,只有 out 型实参才能传递给 out 型函数参数。但是,当调用函数的时候,你会非常容易忘记 ref 和 out 修饰符,所以最好不要重载 ref 和 out 型参数。例如:
sealed class Overloading
{
public static void Example(int parameter)
{ ... }
public static void Example(ref int parameter)
{ ... }
static void Main ()
{
int argument = 42;
Example(argument);// 在这儿 非常容易忘记 ref 修饰符
}
}
9. 访问规则
l ** 函数参数或返回值不能比所属函数的访问级别低 ** ** **
** sealed class ** ** T { ... } // ** ** 类的默认访问级别是 ** ** internal **
** public sealed class ** ** Bad **
** { **
** public void ** ** Parameter(T t) // ** ** 错误,函数的访问级别( ** ** public ** ** )比参数高 **
** { ... } **
** public ** ** T Return() // ** ** 错误,函数的访问级别( ** ** public ** ** )比返回值高 **
** { ... } **
** } **
** public sealed class ** ** Good **
** { **
** ** ** private void ** ** Parameter(T t) // ** ** 正确,函数的访问级别( ** ** private ** ** )比参数低 **
** { ... } **
** ** ** private ** ** T Return() // ** ** 正确,函数的访问级别( ** ** private ** ** )比返回值低 **
** { ... } **
** } **
10. 找错误
** sealed class ** ** Buggy **
** { **
** ** ** void ** ** Defaulted( ** ** double ** ** d = 0.0) 1 **
** { ... **
** } **
** ** ** void ** ** ReadOnly( ** ** const ref ** ** Wibble w) 2 **
** { ... **
** } **
** ** ** ref int ** ** ReturnType() 3 **
** { ... **
** } **
** ** ** ref int ** ** fieldModifier; 4 **
** } **
第 1 个函数的错误是: C# 中函数不能拥有缺省参数。
第 2 个函数的错误是: ref 型参数不能用 const 修饰,因为 ref 型参数是可能变化的。
第 3,4 个函数的错误是: ref 和 out 型参数只能用于函数参数和实参。
C# 中可以通过函数重载的办法实现缺省参数的功能,以下是实现的方法:
sealed class Overload
{
void DefaultArgument() { DefaultArgument(0.0); }
void DefaultArgument(double d) { ... }
}