对于引用类型,作为参数传递时,使用ref或out和不使它有什么区别?

zzzl 2003-09-13 05:46:40
rt
...全文
140 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingfuhai 2003-12-17
  • 打赏
  • 举报
回复
我的理解,在swap(Class1 a,Class1 b)中,参数a,b传入函数是将他们的值(类似C++的对象指针)拷贝一份传了进去,因为这个值和a一样,他们都对应heap里相同的对象,所以函数内部可以修改该对象的成员的内容,但是对a的任何修改在函数结束时都被丢弃掉,所以a还是指向heap中的那个对象。如果以ref传入,函数内就有了一个a指针的一个别名而已,这个别名就是a,而不是a的拷贝。
dingfuhai 2003-12-17
  • 打赏
  • 举报
回复
以上不用ref也可以改变a.X,和b.Num1的值
dingfuhai 2003-12-17
  • 打赏
  • 举报
回复
class MyMain
{
void swap(ref A a,ref B b)
{
int temp;
temp=a.X;
a.X=b.Num1;
b.Num1=temp;
Console.WriteLine("swap 函数内 A.X={0} B.Num1={1}",a.X,b.Num1);
}
static void Main()
{
A a=new A();
a.X=1;
B b=new B();
b.Num1=2;
MyMain m=new MyMain();
Console.WriteLine("swap 函数执行前 A.X={0} B.Num1={1}",a.X,b.Num1);
m.swap(ref a,ref b);
Console.WriteLine("swap 函数外 A.X={0} B.Num1={1}",a.X,b.Num1);
Console.ReadLine();
}
}

class A
{
public int X;
}
class B
{
public int Num1;
}
这是为什么?
zzzl 2003-09-13
  • 打赏
  • 举报
回复
明白了,呵呵~
AhBian 2003-09-13
  • 打赏
  • 举报
回复
上面的代码是随手写的,下面是可测试代码:

using System;

public class Class1
{
public string MyStr;
public Class1(string str)
{
MyStr = str;
}

public static void foo(Class1 var)
{
var = new Class1("B");
}

public static void foo(ref Class1 var)
{
var = new Class1("B");
}

public static void Main()
{
Class1 myClass1 = new Class1("A");
foo(myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 A
foo(ref myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 B
// 应该看到不同了吧。
}
}
AhBian 2003-09-13
  • 打赏
  • 举报
回复
完全不一样,此处我不说 out 了,而用不用 ref 是有明显的区别的。

public class Class1
{
public string MyStr;
public Class1(string str)
{
MyStr = str;
}
}

public void foo(Class1 var)
{
var = new Class1("B");
}

public void foo(ref Class1 var)
{
var = new Class1("B");
}

public static void Main()
{
class1 myClass1 = new class1("A");
foo(myClass1);
Console.WriteLine(myClass1.MyStr); // 输出 A
foo(ref myClass1)
Console.WriteLine(myClass1.MyStr); // 输出 B
// 应该看到不同了吧。
}
jjcccc 2003-09-13
  • 打赏
  • 举报
回复
zzzl(这个屠夫心狠手辣) 你太厉害了!
zzzl 2003-09-13
  • 打赏
  • 举报
回复
不是吧,我试过了,即使不加ref,在函数体内改变参数也会影响到函数外。
jjcccc 2003-09-13
  • 打赏
  • 举报
回复
ref 传递的是引用,你可以在函数对其操作,若改变了其值,退出函数后,作为ref参数的传入的变量的值也跟著变化。
若不加ref,则传递的是值,是变量或对象的拷贝,在函数体无论怎么对它操作,都不会影响传入前的值。
panyee 2003-09-13
  • 打赏
  • 举报
回复
那区别就是后面一段, 是否对此参数进行操作

out是必须有运算操作
要不编译不通过
zzzl 2003-09-13
  • 打赏
  • 举报
回复
如果已经实例化过了,那么加和不加ref有什么区别?
panyee 2003-09-13
  • 打赏
  • 举报
回复
ref是进入函数前必须实例化, 在函数体内不一定要对它进行操作

out进入函数前不一定实例化, 但函数体的每一个流程必须有一次对它的操作

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧