简单点当你传 out private void myMethod(out int a)
{
在方法里面必须给 a 赋值;如 a = 34;
}
private void myMethod(ref int a)
{
在方法里面不一定给 a 赋值;
但是如果用了a = 34;//a 的值将被改变
}////////////////////////////////int a =100;
myMethod(ref a);
此时a = 34;
{
在方法里面必须给 a 赋值;如 a = 34;
}
private void myMethod(ref int a)
{
在方法里面不一定给 a 赋值;
但是如果用了a = 34;//a 的值将被改变
}////////////////////////////////int a =100;
myMethod(ref a);
此时a = 34;
ref直接操作参数的内存地址。输入参数则强制要在方法里面赋值。
方法的参数是个值得特别注意的地方。方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。看下面的例子及其输出:
using System;
class Test
{
static void Swap(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
static void Swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
}
static void Main()
{
int i = 1, j = 2;
Swap(ref i, ref j);
Console.WriteLine("i = {0}, j = {1}", i, j);
Swap(i,j);
Console.WriteLine("i = {0}, j = {1}", i, j);
}
}
程序经编译后执行输出:
i = 2, j = 1
i = 2, j = 1
我们可以清楚地看到两个交换函数Swap()由于参数的差别--传值与传址,而得到不同的调用结果。注意传址参数的方法调用无论在声明时还是调用时都要加上ref修饰符。
一般的,通过强制使用out声名参数可以清楚的表明这是个传出参数,
从而避免一些不必要的误解,而且也利于以后的维护
你是否想一次返回多个值?在C++语言中这项任务基本上是不可能完成的任务。在c#中"out"关键字可以帮助你轻松完成。这个关键字可以通过参数一次返回多个值。
public class mathClass
{
public static int TestOut(out int iVal1, out int iVal2)
{
iVal1 = 10;
iVal2 = 20;
return 0;
} public static void Main()
{
int i, j; // 变量不需要初始化。
Console.WriteLine(TestOut(out i, out j));
Console.WriteLine(i);
Console.WriteLine(j);
}
} 结果: 0 10 20 IN 参数 c#种的四种参数形式:
一般参数
in参数
out参数
在C语言你可以通传递地址(即实参)或是DELPHI语言中通过VAR指示符传递地址参数来进行数据排序等操作,在C#语言中,是如何做的呢?"in"关键字可以帮助你。这个关键字可以通过参数传递你想返回的值。
namespace TestRefP
{
using System;
public class myClass
{ public static void RefTest(ref int iVal1 )
{
iVal1 += 2; }
public static void Main()
{
int i=3; //变量需要初始化 RefTest(ref i );
Console.WriteLine(i); }
}
} 必须注意的是变量要须先初始化。 结果: 5
{
int i = 1, j = 2;
Swap(ref i, ref j);
Console.WriteLine("i = {0}, j = {1}", i, j);
Swap(ref i,ref j);
Console.WriteLine("i = {0}, j = {1}", i, j);
} i = 2, j = 1
i = 1, j = 2
out : 新增加的输出,空的ref: 引用传入的参数,在原有的基础上加分不同的情况用不同的
C++也可以做到的,谁说做不到
class Test
{
static void Swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
Console.WriteLine("x = {0},y = {1}",x,y);
}
static void Main()
{
int i = 1, j = 2;
Swap( i, j);
Console.WriteLine("i = {0}, j = {1}", i, j);
}
} 输出结果为:
i = 2, j = 1
i = 1, j = 2
这说明了交换函数的意义虽然不能改变原来变量中的存储值但可以将以这两个变量的考贝的形式的值交换,这个结论对不对?