class PassingValByRef
{ static void SquareIt(ref int x)
{
x*=x;
Console.WriteLine("{0}",x);
}
public static void Main()
{
int myInt=5;
Console.WriteLine("{0}", myInt);
SquareIt(ref myInt);
Console.WriteLine("{0}", myInt);
Console.ReadKey();
}
}
输出结果是5、25、25
ref到底是啥用法啊,请教,看书,也生硬,不太懂,能不能通俗易懂的
{ static void SquareIt(ref int x)
{
x*=x;
Console.WriteLine("{0}",x);
}
public static void Main()
{
int myInt=5;
Console.WriteLine("{0}", myInt);
SquareIt(ref myInt);
Console.WriteLine("{0}", myInt);
Console.ReadKey();
}
}
输出结果是5、25、25
ref到底是啥用法啊,请教,看书,也生硬,不太懂,能不能通俗易懂的
由于int是值类型, 在方法参数传递int的时候是一个拷贝的过程
如果不用ref,你的Main函数中的myInt和SquareIt函数中的x完全就是2个不同的对象,不管你SquareIt函数中的x怎么变化,Main函数中的myInt是不会变的。
但是加了ref就不一样了,那就是不是拷贝,而是传递地址,地址一样对象也就相同,SquareIt函数中的x不是值而是地址,x变那么Main函数的中myInt也跟着变
使用ref前必须对变量赋值,out不用。
ref是传入值,out是传出值
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
http://blog.csdn.net/chopper7278/archive/2008/10/02/3010048.aspx
using System;
class PassingValByRef
{
public static void SquareIt(ref int x)
{
x*=x;//等同于x=x*x; 既x=5*5,此时x为25。
Console.WriteLine("{0}",x); //输出x值为25.
//注:本函数使用ref关键字,所以本函数返回x的值(x=25)
}
} class Test
{
static void Main()
{
int myInt=5;
Console.WriteLine("{0}", myInt);//myInt值为5,输出5.
PassingValByRef.SquareIt(ref myInt);//执行PassingValByRef类SquareIt方法
Console.WriteLine("{0}", myInt);//因上行SquareIt方法使用ref关键字,固ref返回的值传给myInt变量。
Console.ReadKey(); }
}
再举个例子using System; class Test
{
static void Swap(ref int x,ref int y)
{
int temp = x;//x=1 temp=1
x = y;//y=2赋给x,x=2
y = temp;//temp=1赋给y,所以y=1
//所以,ref返回x=2,y=1,
}
static void Main()
{
int i =1,j=2;
Swap(ref i,ref j);
Console.WriteLine("{0} {1}",i,j);//根据Swap函数最后以行注释 i=2,j=1
}
}
前两个输出基本懂了,还剩下第三个输出,SquareIt方法不是返回是void的吗,怎么又返回x的值呢,这不是矛盾的吗?如果这样的话,只要一出现 SquareIt(ref myInt);那后面无论什么时候出现myInt,都代表25吗?
SquareIt(ref myInt);调用了SquareIt这个方法,因此,myInt变成25,这个我还能懂,就是最后一个Console.WriteLine("{0}", myInt);跟SquareIt豪不沾边,都是25....
{
static void Divide(int x,int y,out int result,out int remainder)
{
result = x/y;//10/3=3
remainder = x%y;//10%3=1
}
static void Main()
{
int res,rem;
Divide(10,3,out res,out rem);
Console.WriteLine("{0} {1}",res,rem);
}
}看下 int res,rem。变量不需要初始化值既可用于out参数,用ref的话必须给变量初始化值。
其实,我就是想了解最后一个输出结果,前两个输出结果,我都能理解,而且,第二个输出结果,要不要ref输出结果都是25,好些网友也是回答的这一点,我主要是想了解最后一点