2010-02-25 83 views
1

确实C#通使用C#,VS2008,经由一个WinForms在属性传递一个参考类型,由值或ref

如果我通过属性从母体形式传递一个参数到子形式,或INFACT属性到任何类,并且参数传递的C#是一个在父窗体中创建的引用类型,默认情况下它是否作为参数或值传递给 ?

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

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

回答

5

对于引用类型,对变量的引用是按值传递的。当然,除非在C#中使用refout关键字来改变该行为。

这意味着DataSet-valued属性在实际上传递对DataSet实例的引用,并通过值传递它。

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

+0

因此,如果我将数据集作为属性参数传递给子窗体,请更改数据集的内容,然后关闭子窗体,而不检索属性返回值,那么我应该在我创建的数据集对象中找到更改父窗体。对 ? – Spooky2010 2010-02-25 04:03:47

+0

绝对正确。 :-) – CesarGon 2010-02-25 04:05:34

+0

@Jon:哎呀!感谢修复! – CesarGon 2010-02-25 11:52:52

0

C#没有像C++那样通过引用传递。说它传递参考值(反正参考类型)更准确。

Read this by Jon Skeet

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 
+0

你说的很重要,注意“通过引用传递”具有特定的含义 - 这就是为什么你的第一个声明“所有是'类'通过引用传递”是不正确的。参数*不是通过引用传递的 - 它通过值传递,但该值是引用。当您的意思是“按价值传递参考”时,值得避免说“通过参考”。 – 2010-02-25 07:10:35

+0

这正是我的答案解释....你真的读过它吗? – jrista 2010-02-25 07:22:55

+0

是的,我读过它 - 这就是为什么我最终没有倒下。但你的第一句话仍然是误导性的,我相信它应该纠正。 – 2010-02-25 13:30:00

1

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

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