引用参数ref
当一个参数带有ref修饰符时候这个参数就是一个引用参数。引用参数本身并不创建新的存储空间的。
引用参数指向函数子句调用中作为参数给出的相关变量表征的存储空间,所以此参数的值就等于它所指向的变量。修过C的人这个应该很容易明白的。
下面是关于引用参数的赋值规则:
1、在一个变量被传递给函数子句调用中相关引用参数之前,它自身必须被明确赋值;
2、在函数子句界定的范围内,引用参数被认为是初始化过的
输出参数out:
带有out修饰符的参数为输出参数。和引用参数一样out参数本身并不创建新的存储空间,输出参数指向函数子句调用中作为参数给出的相关变量表征的存储空间。这样,此输出参数的数值总是等于它所指向的变量。
下面时关于输出参数的赋值规则:
1、在一个变量被传递给函数子句调用中相关输出参数之前,它自身不需要被明确地赋值(这个是和引用参数不同的,要特别注意);
2、在函数子句调用中,每个被传递给输出参数的变量被认为在该执行路径中已被赋值;
3、在函数子句界定的范围内,输出参数被认为是初始化过的
4、在函数子句返回之前,每一个输出参数必须被明确地赋值(这一点也要特别注意)
在结构体类型的构造函数中,关键字this就象是此结构体类型的输出参数
下面看一个列子具体来说说这个引用和输出参数:
publicstatic void RefAndOutParam(ref int refParam, out int outParam)
{
}
错误 1 控制离开当前方法之前必须对 out 参数“outParam”赋值D:\_net\conv_logs_process\C_SHARP\Program.cs
2228 C_SHARP
上面就是在方法结束之前未对out参数复制,系统就会提示这种错误;
class Program
{
static void Main(string[] args)
{
int refParam = 11;
int outParam = 22;
MyClass.RefAndOutParam( refParam, outParam);
System.Console.WriteLine(refParam);
System.Console.WriteLine(outParam);
}
}
class MyClass
{
public static void RefAndOutParam(ref int refParam,out int outParam)
{
outParam = 20;
refParam = 10;
}
}
错误 1 与“C_SHARP_WBB.MyClass.RefAndOutParam(ref int,out int)”最匹配的重载方法具有一些无效参数
D:\_net\conv_logs_process\C_SHARP\Program.cs
1413 C_SHARP
错误 2 参数 1 必须使用关键字“ref”传递
D:\_net\conv_logs_process\C_SHARP\Program.cs
1437 C_SHARP
错误 3 参数 2 必须使用关键字“out”传递
D:\_net\conv_logs_process\C_SHARP\Program.cs
1447 C_SHARP
特别注意,引用带有引用参数和输出参数的方法时候,必须加上ref和out;
classProgram
{
static void Main(string[] args)
{
int refParam;
int outParam = 22;
MyClass.RefAndOutParam(refrefParam,out outParam);
System.Console.WriteLine(refParam);
System.Console.WriteLine(outParam);
}
}
class MyClass
{
public static void RefAndOutParam(ref int refParam,out int outParam)
{
outParam = 20;
refParam = 10;
}
}
错误 1 使用了未赋值的局部变量“refParam”D:\_net\conv_logs_process\C_SHARP\Program.cs
1440 C_SHARP
上面是对ref参数未被明确赋值;
classProgram
{
static void Main(string[] args)
{
int refParam = 11;
int outParam = 22;
MyClass.RefAndOutParam(refrefParam,out outParam);
System.Console.WriteLine(refParam);
System.Console.WriteLine(outParam);
}
}
class MyClass
{
public static void RefAndOutParam(ref int refParam,out int outParam)
{
outParam = 20;
refParam = 10;
}
}
上面这段代码输出