将 ref 关键字与引用类型参数一起使用有啥好处?

Posted

技术标签:

【中文标题】将 ref 关键字与引用类型参数一起使用有啥好处?【英文标题】:What is the advantage of using the ref keyword with a reference type parameter?将 ref 关键字与引用类型参数一起使用有什么好处? 【发布时间】: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 可能 如果它能够检测到没有分配,则删除它) 【参考方案1】:

如果您不更改引用指向的内容,作为开发人员,通过使用 ref 关键字将引用类型参数传递给方法,我可以获得什么?

什么都没有 - 这是通过引用传递引用类型的唯一目的是如果您要更改引用所指的内容。

公平地说 - 它使您能够在未来改变这种行为,这将是虐待狂和残忍的......

【讨论】:

除了没有得到任何东西之外,我会说你输了。既然ref 已经存在,读者希望该引用会以某种方式进行更改,否则为什么它会存在呢?得知参考文献从未改变是一个惊喜,这让读者脱离了他们的常规。

以上是关于将 ref 关键字与引用类型参数一起使用有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

值类型或引用类型的好处?

使用关键字“ref”传递类对象有啥用?默认情况下,它们是通过引用传递的[重复]

C# ref与out关键字区别

将 await 与异步数据库调用一起使用有啥好处

引用类型参数,ref按引用传值

将引用传递给对象有啥好处? [复制]