C#中变量之间的传递默认是值传递,什么叫值传递呢?就是说,当一个方法需要我事先定义的变量作为参数的时候,默认只是把变量的值传递过去了。
例如:
namespace ConsoleApplication1
{
class Program
{
static void A(int x)
{
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x=0;
A(x);
Console.WriteLine(x);
Console.ReadKey();
}
}
}
A方法需要Main()方法中的变量x作为参数,此时知识把“0”传递给了方法A,A里面做了x++的运算,但是不影响Main()方法里面x的值,折旧相当于A方法中定义了另一个变量y用来承接x,A里面操作的是y,而不是x,因为A里面定义了一个int x,这两个x是不一样的,因为它们指向不同的地址。
那么我们希望Main()和A()都指向同一个地址的x怎么办呢?
那就不用值传递,用引用传递吧,把一个值作为一个引用传递过去。
ref和out就是专门干这种勾当的!
它们的区别是:用ref的时候要确保值已经被赋值了,而有的时候事先赋值没有意义,那就用out;
namespace ConsoleApplication1
{
class Program
{
static void A(ref int x) //区别在这里
{
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x=0;
A(ref x); //区别在这里
Console.WriteLine(x);
Console.ReadKey();
}
}
}
最后输出:
注意,上面的代码中,int x=0;不给它赋值的话就会报错:
不赋值怎么办呢?那就用out呗:
namespace ConsoleApplication1
{
class Program
{
static void A(out int x)
{
x = 2; //这里再给它赋值
Console.WriteLine(x);
x++;
Console.WriteLine(x);
}
static void Main(string[] args)
{
int x;
A(out x);
Console.WriteLine(x);
Console.ReadKey();
}
}
}
运行结果:
事实证明:ref和out都可以把变量从值传递变换为引用传递。