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

Posted

技术标签:

【中文标题】在 `System.Windows.Forms` 控件中没有 `ref` 关键字的情况下,如何通过引用传递【英文标题】:How pass by reference works without `ref` keyword in `System.Windows.Forms` controls 【发布时间】:2015-02-11 19:35:12 【问题描述】:

我想知道在 System.Windows.Forms 控件中没有 ref 关键字的情况下如何通过引用传递。

这是我目前尝试过的代码

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;

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

【问题讨论】:

Jeffrey Richter 的 CLR via C# 这本书帮助我理解了许多与 .NET 类似的问题。在本书中,在前几章解释 ref 关键字时,它有一个示例来演示通过 ref 传递引用类型可以做什么(使用 ref 关键字),非常令人印象深刻。 【参考方案1】:

Button 是一个引用类型,所以即使你没有传递 by 引用,你也传递了 a 引用(按值)。换句话说,不会创建对象的副本,而是将指向它的“指针”(使用 C++ 术语)传递给函数。

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

int 是一个值类型,所以在传递之前复制的(除非由ref 传递)。因此,更改(分配)不会传播回调用者。

澄清 cmets 中的响应:

你不能通过值传递一个引用类型object,这意味着运行时在传递它之前创建一个副本。但是,引用本身按值传递的(这就是赋值不会传播给调用者的原因)。您还可以使用Object.MemberwiseClone(和类似方法)显式创建副本并按值传递 that 引用。不过,该函数尤其会生成浅拷贝,因此在使用时要注意这一点。

【讨论】:

有一篇很棒的文章,让我试着挖掘一下。这是:blogs.msdn.com/b/jaredpar/archive/2010/01/21/… 虽然我没有要求问这个,但出于好奇,我问 - 我可以在调用 的方法时将通过引用更改为按值传递(如 int)按钮? @BradleyDotNET

以上是关于在 `System.Windows.Forms` 控件中没有 `ref` 关键字的情况下,如何通过引用传递的主要内容,如果未能解决你的问题,请参考以下文章

允许 System.Windows.Forms.WebBrowser 运行 javascript

System.Windows.Forms.Screen.DeviceName 在 Windows XP 上提供垃圾

无法在 C# 中将类型“System.EventHandler”隐式转换为“System.Windows.Forms.KeyPressEventHandler”[重复]

System.Windows.Forms.Timer没有触发

wpf 不能引用system.window.Forms

System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer