传递ref关键字

时间:2015-05-30 10:47:47

标签: c#

我在主窗体中有2个标签页(tabA和tabB)。假设我将tabA传递给主要表单初始化tabB

tabB = new TabB(tabA);

所以我观察到的是,在更改tabA内的值(比如tabA.Text)之后,tabBtabB.tabA.Text)中的值也会发生变化。

所以我的理解(来自C ++)是类似于pass-by-reference。所以我的问题是,如果我写这个有什么区别呢?

tabB = new TabB(ref tabA);

3 个答案:

答案 0 :(得分:3)

你对C ++的比喻是不正确的。在C#中传递引用对象 * 类似于在C ++中通过指针传递对象,但C#不需要星号来取消引用这些指针。

在C#中通过引用传递类似于在C ++中通过引用传递指针:除了在函数内使用该指针之外,您还可以为其分配新值,从而更改指针的值在来电者。

这是一个简短的插图:

void One(List<int> list) {
    // Reassignment of the list is local to method One
    list = new List<int> {1, 2, 3};
}
void Two(ref List<int> list) {
    // Reassignment of the list is visible in the caller
    list = new List<int> {1, 2, 3};
}
...
var demo = new List<int> {5, 6, 7};
One(demo);
// Here the list remains [5, 6, 7]
Two(ref demo);
// Here the list becomes [1, 2, 3]

* 与复制的struct和基元等值对象相反。

答案 1 :(得分:1)

不同之处在于,如果您在tabA构造函数中通过TabB参数更改了指向的对象,tabA也将使用新对象。

实际上没有办法传递对象本身,但是你可以进行复制/克隆,它看起来就像原版一样。已经为复制Windows控件的一般情况编写了a good answer,而仅为选项卡编写了an answer

答案 2 :(得分:0)

不同之处在于,通过使用ref关键字,您可以更改引用本身,而不仅仅是引用所指向的对象。

void funcA(TabA tabA)
{
   // setting tabA to null here has no effect outside this function
   tabA = null;
}

void funcB(ref TabA tabA)
{
   // setting tabA to null persists outside this function
   // and changes the actual reference passed in.
   tabA = null;
}

// tabA initialized to non-null
tabA = new TabA();

funcA(tabA);

// tabA is still not null

funcB(ref tabA);

// tabA is now null