【发布时间】:2016-02-10 14:29:51
【问题描述】:
作为开发人员,通过使用 ref 关键字如果您不更改引用指向的内容,将引用类型参数传递给方法,我可以获得什么?
我已经阅读了ref keyword with reference type parameter 和What is the use of "ref" for reference-type variables in C#? 以及其他一些内容。我知道这个主题已经被问及回答了很多次。我相信我在问一个独特的问题。如果您知道其他 wize,请随时标记我的问题。
简单类:
public class Person
{
public Person(string first, string last)
{
FirstName = first;
LastName = last;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return string.Format("{0} {1}", FirstName, LastName);
}
}
使用关键字“ref”传递表单:
public partial class Form2 : Form
{
private Person _person;
public Form2()
{
_person = new Person("John", "Doe");
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
textBox1.Text = _person.ToString();
base.OnLoad(e);
}
private void button1_Click(object sender, EventArgs e)
{
ChangeLastName(ref _person);
textBox2.Text = _person.ToString();
}
private static void ChangeLastName(ref Person person)
{
person.LastName = "Smith";
}
}
不使用关键字'ref'的表单传递参数:
public partial class Form2 : Form
{
private Person _person;
public Form2()
{
_person = new Person("John", "Doe");
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
textBox1.Text = _person.ToString();
base.OnLoad(e);
}
private void button1_Click(object sender, EventArgs e)
{
ChangeLastName(_person);
textBox2.Text = _person.ToString();
}
private static void ChangeLastName(Person person)
{
person.LastName = "Smith";
}
}
如果有什么区别,或者作为开发人员,我从前者中获得了什么(除了能够在我的方法中更新传递的参数)?
提前致谢,
【问题讨论】:
-
你是否真的遇到过通过引用传递但不改变引用的代码?
-
@chris,我有很多次。它通常是由不了解 ref/value 类型和 ref/value 参数之间区别的人编写的代码。
-
是的 - 问题听起来像“++i 或 i++ 哪个更好?”
-
不,@Chris 我想知道是否应该更改它。与不使用 ref 相比,这种方式“更正确”(我讨厌这样写)吗?
-
唯一的区别(从 IL 的角度来看)是一个额外的
ldind.ref来间接加载对象的地址(即使这样;JIT 可能 如果它能够检测到没有分配,则删除它)