out 和ref好难理解,能帮帮忙吗?
如题,能说说您的理解吗?谢谢了 问题点数:0、回复次数:11Top
1 楼HNU(嶽麓書院,惟楚有材,於我為盛!)回复于 2003-11-01 21:36:06 得分 0
简单点
当你传 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;
Top
2 楼Abac(~~)回复于 2003-11-02 01:06:52 得分 0
同意楼上,虽然都可以从方法里得到数值,但ref和out改变的方式不同。
ref直接操作参数的内存地址。输入参数则强制要在方法里面赋值。Top
3 楼rgbcn(奔向.net)回复于 2003-11-02 01:44:27 得分 0
方法参数
方法的参数是个值得特别注意的地方。方法的参数传递有四种类型:传值(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修饰符。
Top
4 楼caff(caff)回复于 2003-11-02 02:18:09 得分 0
更重要的是在于使用的意义上
一般的,通过强制使用out声名参数可以清楚的表明这是个传出参数,
从而避免一些不必要的误解,而且也利于以后的维护Top
5 楼coudoufu(只爱细宝宝)回复于 2003-11-02 10:51:17 得分 0
一个是值,一个是引用。Top
6 楼dldl(做饭我一直用雕牌)回复于 2003-11-02 20:47:22 得分 0
2 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
Top
7 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 14:58:58 得分 0
rgbcn(cody)你好看了,也就是说如果做下面改动的话就会这样输出是不是
static void Main()
{
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
Top
8 楼vipfenghuang(张伟)回复于 2003-11-04 15:03:10 得分 0
out : 新增加的输出,空的
ref: 引用传入的参数,在原有的基础上加
分不同的情况用不同的Top
9 楼ffb(项目急,顾不了结构的)回复于 2003-11-04 15:22:34 得分 0
dldl(403) :
C++也可以做到的,谁说做不到Top
10 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 15:36:45 得分 0
那么交换的意义在那里呢Top
11 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 15:55:31 得分 0
using System;
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
这说明了交换函数的意义虽然不能改变原来变量中的存储值但可以将以这两个变量的考贝的形式的值交换,
这个结论对不对?Top




