我一直在阅读了一下MSDN上的教程,让我的头周围传递通过引用在C#out
,ref
并和我遇到下面的代码示例来了:传递通过引用和参考
using System;
class TheClass
{
public int x;
}
struct TheStruct
{
public int x;
}
class TestClass
{
public static void structtaker(TheStruct s)
{
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
a.x = 1;
b.x = 1;
structtaker(a);
classtaker(b);
Console.WriteLine("a.x = {0}", a.x); //prints 1
Console.WriteLine("b.x = {0}", b.x); //prints 5
}
}
从教程的说明到此:
本实施例表明当结构被传递给一个方法中, 副本结构被传递,但是当一个类的实例被传递,参考 是通过。
我完全理解它,但我的问题是,如果引用在C#中传递给参数,为什么他们需要ref
如下面的示例所示:
void tearDown(ref myClass a)
{
a = null;
}
MyClass b = new MyClass();
this.tearDown(ref b);
assert(b == null);
//b is null
???我认为C在C中是一样的 - 按值传递。
仅仅因为它是一个引用类型,并不意味着它通过引用传递。除非明确使用'ref',否则传递是有价值的。 –
@JeroenVannevel是的,传递是默认值,但传递的值是引用类型的引用。 – MarcinJuraszek
部分'MyClass b = new MyClass();'创建2个内存:引用变量'b'和堆上的匿名实例。引用变量的行为完全像一个值类型(例如'int')。 –