参数对于每个学习编程的人都很清楚,在任何程序中都不可能没有参数,下面我就说说一个特殊的参数类型,其实这个也不算什么特殊参数了,在c#中已经没有像C中那样的指针的概念了,但是有的时候有些时候要写特殊的处理,其实c#中并不是完完全全放弃这个概念的,下面就写下这类特殊的参数。
引用参数ref
当一个参数带有ref修饰符时候这个参数就是一个引用参数。引用参数本身并不创建新的存储空间的。
引用参数指向函数子句调用中作为参数给出的相关变量表征的存储空间,所以此参数的值就等于它所指向的变量。修过C的人这个应该很容易明白的。
下面是关于引用参数的赋值规则:
1、在一个变量被传递给函数子句调用中相关引用参数之前,它自身必须被明确赋值;
2、在函数子句界定的范围内,引用参数被认为是初始化过的
输出参数out:
带有out修饰符的参数为输出参数。和引用参数一样out参数本身并不创建新的存储空间,输出参数指向函数子句调用中作为参数给出的相关变量表征的存储空间。这样,此输出参数的数值总是等于它所指向的变量。
下面时关于输出参数的赋值规则:
1、在一个变量被传递给函数子句调用中相关输出参数之前,它自身不需要被明确地赋值(这个是和引用参数不同的,要特别注意);
2、在函数子句调用中,每个被传递给输出参数的变量被认为在该执行路径中已被赋值;
3、在函数子句界定的范围内,输出参数被认为是初始化过的
4、在函数子句返回之前,每一个输出参数必须被明确地赋值(这一点也要特别注意)
在结构体类型的构造函数中,关键字this就象是此结构体类型的输出参数
下面看一个列子具体来说说这个引用和输出参数:
public static void RefAndOutParam(ref int refParam, out int outParam)
{
}
错误 1 控制离开当前方法之前必须对 out 参数“outParam”赋值 D:\_net\conv_logs_process\C_SHARP\Program.cs 22 28 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 14 13 C_SHARP
错误 2 参数 1 必须使用关键字“ref”传递 D:\_net\conv_logs_process\C_SHARP\Program.cs 14 37 C_SHARP
错误 3 参数 2 必须使用关键字“out”传递 D:\_net\conv_logs_process\C_SHARP\Program.cs 14 47 C_SHARP
特别注意,引用带有引用参数和输出参数的方法时候,必须加上ref和out;
class Program
{
static void Main(string[] args)
{
int refParam;
int outParam = 22;
MyClass.RefAndOutParam(ref refParam,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 14 40 C_SHARP
上面是对ref参数为被明确赋值;
class Program
{
static void Main(string[] args)
{
int refParam = 11;
int outParam = 22;
MyClass.RefAndOutParam(ref refParam,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;
}
}
上面这段代码输出