如何在没有`System.Windows.Forms`控件的`ref`关键字的情况下通过引用传递

时间:2014-12-13 01:46:31

标签: c# .net winforms pass-by-reference ref

我想知道在ref控件中没有System.Windows.Forms关键字时,引用传递是如何工作的。

这是我到目前为止尝试过的代码

ChangeProperties(button1); //Call the method without ref keyword

这是方法

public void ChangeProperties(Button btn)
{
  // Code that changes the properties
}

当我通过不带ref关键字的按钮调用上述方法时,原始按钮的属性会不断变化。

我还使用int

尝试了以下方法
int j=10;
ChangeValue(j);// Value doesn't change without ref keyword

以下是方法。

public static int ChangeValue(int i)
{
    i = 0;
    return i;
}

谁能告诉我这是怎么回事?

1 个答案:

答案 0 :(得分:4)

Button是一种引用类型,因此即使您通过> 引用,您也会传递 a 引用(按价值)。换句话说,没有创建对象的副本,"指针" (使用C ++术语)将其传递给函数。

因此,当您更改其属性时,这些更改将反映在原始对象中。请注意,分配参数将反映在调用方法中。

int是一种值类型,因此在传递之前复制(除非ref传递)。因此,更改(赋值)不会传播回调用者。

澄清评论中的回应:

在传递运行时创建副本的意义上,您不能按值传递引用类型对象。但是,引用本身按值传递(这就是赋值不会传播给调用者的原因)。您还可以使用Object.MemberwiseClone(和类似方法)显式创建副本,并按值传递 引用。该功能特别是制作浅色副本,因此在使用时请注意这一点。