在属性中传递ref类型,C#是通过值还是ref传递

时间:2010-02-25 03:43:58

标签: c# pass-by-reference

使用c#,vs2008,winforms

如果我通过属性将参数从父表单传递给子表单,或者通过属性传递给任何类,并且通过C#传递的参数是在父表单中创建的引用类型, 默认情况下它会作为ref或值传递吗?

例如,如果我通过属性传递数据集。 如果它确实通过值传递,你可以通过属性传递给它吗? 或者我应该通过方法参数传递它,这是更好的做法吗?

Basicaly我想要将一个填充的对象检索回父窗体,并且感觉通过ref传递一个在父窗体中创建的对象更好。

4 个答案:

答案 0 :(得分:5)

对于引用类型,通过值传递对变量的引用。当然,除非你在C#中使用refout个关键字来改变这种行为。

这意味着DataSet值属性实际上传递了对DataSet实例的引用,并按值传递。

Jon Skeet's "C# in Depth"是关于这些问题的一个很好的参考(没有双关语)。

答案 1 :(得分:2)

重要的是要注意C#中的引用传递具有特定含义。在属性的情况下,属性最终指向与其设置的对象相同的地址。在将对象传递给函数的情况下,C#按值语义使用传递引用。这意味着复制了引用本身,因此新指针指向与传递的对象相同的地址。这可以防止函数通过将其参数设置为null来使任何原始指针无效。要实际传递原始引用,必须使用'ref'关键字:

class SomeClass
{
  public object MyObjectProperty { get; set; }
}

var someClass = new SomeClass();
object someObject = new object();

someClass.MyObjectProperty = someObject; // Makes MyObjectProperty point to the same location as someObject

在以下情况中,使用值语义引用:

void MyMethod(object someObject)
{
   someObject = null;
}

object someObject = new object();
MyMethod(someObject);
Console.WriteLine(someObject == null); // Prints false

在以下情况中,使用实际的引用语义传递:

void MyMethod(ref object someObject)
{
   someObject = null;
}

object someObject = new object();
MyMethod(ref someObject);
Console.WriteLine(someObject == null); // Prints true

答案 2 :(得分:1)

首先要理解的是,在.Net中,变量可以是值类型(例如int)或引用类型(类)。值类型变量直接指向内存中的值,而引用类型变量指向内存位置。

默认情况下,参数按值传递。但是,请记住,引用类型的“值”实际上是它在内存中的位置。因此,即使它被称为传递值,您实际上也是在传递对特定类的引用。

答案 3 :(得分:0)

C#不像C ++那样通过引用传递。更准确地说它通过参考值(无论如何都是参考类型)。

Read this by Jon Skeet