В чем преимущество использования ключевого слова ref с параметром ссылочного типа?

Что я получаю как разработчик, передавая аргумент ссылочного типа методу с использованием ключевого слова ref , если вы не меняете то, на что указывает ссылка?

Я прочитал оба, ключевое слово ref с параметром ссылочного типа и Какое использование ref для переменных ссылочного типа в C #? и ряд других. Я знаю, что эту тему спрашивали и отвечали очень много раз. Я считаю, что задаю уникальный вопрос. Не стесняйтесь отметить мой вопрос, если вы знаете других мудрецов.

Простой класс:

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";
    }
}

В чем разница, если она есть, или что я как разработчик получаю от первого (кроме возможности обновлять переданный параметр внутри моего метода)?

Заранее спасибо,


person Randy    schedule 09.11.2015    source источник
comment
Вы действительно встречали код, который передается по ссылке, но не меняет ссылку?   -  person chris    schedule 09.11.2015
comment
@chris, много раз. Обычно это код, написанный людьми, которые не понимают разницы между типами ref / value и параметрами ref / value.   -  person Thomas Levesque    schedule 09.11.2015
comment
да - вопрос звучит как что лучше ++ i или i ++?   -  person jgasiorowski    schedule 09.11.2015
comment
Нет, @Chris, мне интересно, стоит ли мне это изменить. Является ли это более правильным (я ненавижу такое писать), чем не использовать ref?   -  person Randy    schedule 09.11.2015
comment
Единственное отличие (с точки зрения IL) - это дополнительный ldind.ref для косвенной загрузки адреса объекта (и даже тогда; JIT может удалить его, если сможет чтобы обнаружить, что присвоения не было)   -  person Sehnsucht    schedule 09.11.2015
comment
Взгляните на этот скрипач, надеюсь, это поможет   -  person Gian Paolo    schedule 09.11.2015
comment
@GianPaolo OP явно указано, если вы не меняете то, на что указывает ориентир   -  person Sehnsucht    schedule 09.11.2015
comment
Вы правы @Sehnsucht, я упустил суть.   -  person Gian Paolo    schedule 09.11.2015


Ответы (1)


Что я получаю как разработчик, передавая аргумент ссылочного типа методу с использованием ключевого слова ref, если вы не меняете то, на что указывает ссылка?

Никакого - единственная цель передачи ссылочного типа по ссылке - это если вы собираетесь изменить то, на что ссылается ссылка.

Честно говоря, это дает вам возможность изменить то поведение в будущем, которое было бы садистским и жестоким ...

person D Stanley    schedule 09.11.2015
comment
Я бы сказал, что помимо того, что вы ничего не получаете, вы проигрываете. Теперь, когда там ref, читатели ожидают, что ссылка будет каким-то образом изменена, потому что иначе почему бы она там была? Узнав, что ссылка никогда не меняется, становится сюрпризом и выводит читателя из их привычки. - person chris; 09.11.2015