out ———— 一个引用传递
1、如果一个方法中的变量在使用out作为参数时,在方法中对out参数所作的更改都会反映到该变量。
static void Method(out int iValue)
{
iValue = 44;
}
static void Main()
{
int a; //不必初始化 Method(out a);//显示使用out关键字 Console.WriteLine(a);//a is now 44 }
2、若要使用out参数,方法定义以及方法的调用都必须显示使用out关键字;
3、不必初始化作为out参数传递的变量,因为out参数在进入方法后清空自己,也因为这个原因必须在方法返回之前为out参数赋值。(只有地址没有值的参数是不能被.NET接受的)。ref要求变量必须在传递之前进行初始化。
ref ----- 仅仅是一个地址!
1、当一个方法在使用ref参数时,在方法中对ref参数所作的任何更改都将反映在该变量中。
static void Method(ref int iValue)
{
iValue = 44;
}
static void Main()
{
int a = 0; //必须初始化 Method(ref a);//显示使用ref关键字 Console.WriteLine(a);//a is now 44 }
2、如果使用ref参数,则必须将参数作为ref参数显示传递到方法。ref参数的值可以被传递到ref参数。
3、ref参数传递的变量必须初始化,因为ref参数在进入方法后还是它自己,它这个地址指向的还是原来的值,正因为这个原因ref参数可以在使用它的方法内部不操作。这与out不同,out的参数在传递之前不需要显示初始化。
out 和 ref示例
public static string TestOut(out string str)
{
str="out value";
return "hello world";
} public static void TestRef(ref string str)
{
str="ref value";
}
public static void TestNoRef(string refstr)
{
refstr = "no ref";
}
static void Main()
{
string outStr;
Console.WriteLine(TestOut(out outStr));//返回值 输出"return value" Console.WriteLine(outStr); //调用后的out参数输出"out value" string refStr;//必须初始化 TestRef(ref refStr);
Console.WriteLine(refStr); //调用后的ref参数输出"ref value" TestNoRef(refStr);//不使用ref Console.WriteLine(refStr); //仍然输出"ref value";没有变 }