值参数、引用参数、输出参数
2.1值参数(value parameters)未用 ref 或 out 修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员(方法、实例构造函数、访问器或运算符)时开始存在,并用调用中给定的自变量的值初始化。当返回该函数成员时值参数停止存在。出于明确赋值检查的目的,值参数被视为初始已赋值。
2.2 引用参数(reference parameters)
用 ref 修饰符声明的参数是引用参数。引用参数不创建新的存储位置。相反,引用参数表示的是那个在对该函数成员调用中被当作“自变量”的变量所表示的同一个存储位置。因此,引用参数的值总是与基础变量相同。
下面的明确赋值规则适用于引用参数。
●变量在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值即必须被初始化。
●在函数成员内部,引用参数被视为初始已赋值。
●在结构类型的实例方法或实例访问器内部,this 关键字的行为与该结构类型的引用参数完全相同
2.3输出参数(output parameters)
用 out 修饰符声明的参数是输出参数。输出参数不创建新的存储位置。相反,输出参数表示的是那个在对该函数成员调用中被当作“自变量”的变量所表示的同一个存储位置。因此,输出参数的值总是与基础变量相同。下面的明确赋值规则应用于输出参数。变量在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值。
●在正常完成函数成员调用之后,每个作为输出参数传递的变量都被认为在该执行路径中已赋值。
●在函数成员内部,输出参数被视为初始未赋值。
●函数成员的每个输出参数在该函数成员正常返回前都必须已明确赋值。
●在结构类型的实例构造函数内部,this 关键字的行为与结构类型的输出参数完全相同
引用参数和值参数区别
引用参数相当于是引用参数的地址,函数定义时和函数调用时都必须用 ref 关键字,在调用函数参数的值改变将会影响到参数的实际值,而值参数传递时,先开辟一块内存块,然后拷贝一份放到新开辟的内存块中,这样调用时是调用新内存块中的值,修改也不会使原来的值改变。
引用参数和输出参数区别 引用参数在传递之前必须进行初始化,而输出参数传递不需要。两个都可以在内部修改他的值
具体什么时候用,ref主要还是对于值类型,out可以处理一个没有初始化的数组。
举例:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void valueparameters(int x, int y)
{
++x;
++y;
}
static void referenceparameters(ref int x, ref int y)
{
++x;
++y;
}
static void outputparameters(out int m, out int n, ref int z)
{
m = 12;
n = 12;
z++;
}
static void Main(string[] args)
{
int x = 10;
int y = 20;
valueparameters(x, y);
Console.WriteLine("x={0},y={1}", x, y);
referenceparameters(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y);
int m, n;
int z = 1;
outputparameters(out m, out n, ref z);
Console.WriteLine("m={0},n={1},z={2}",m,n,z);
}
}
/*结果:
x=10,y=20
x=11,y=21
m=12,n=12,z=2
请按任意键继续. . .
*/