在 `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没有触发
System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer