Ключевое слово "ref" и ссылочные типы

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

class A { /* ... */ } 

class B
{    
    public void DoSomething(ref A myObject)
    {
       // ...
    }
}

Есть ли какая-нибудь причина, по которой кто-то здравомыслящий сделал бы такую ​​вещь? Я не могу найти для этого использование в С#

Ответ 1

Пусть

class A
{
    public string Blah { get; set; }
}

void Do (ref A a)
{
    a = new A { Blah = "Bar" };
}

затем

A a = new A { Blah = "Foo" };
Console.WriteLine(a.Blah); // Foo
Do (ref a);
Console.WriteLine(a.Blah); // Bar

Но если просто

void Do (A a)
{
    a = new A { Blah = "Bar" };
}

затем

A a = new A { Blah = "Foo" };
Console.WriteLine(a.Blah); // Foo
Do (a);
Console.WriteLine(a.Blah); // Foo

Ответ 2

Только если они хотят изменить ссылку на объект, переданный как myObject, на другой.

public void DoSomething(ref A myObject)
{
   myObject = new A(); // The object in the calling function is now the new one 
}

Скорее всего, это не то, что они хотят сделать, а ref не требуется.

Ответ 3

Ключевое слово ref полезно, если метод должен изменить ссылку, сохраненную в переменной, переданной методу. Если вы не используете ref, вы не можете изменить ссылку только изменения, сам объект будет виден вне метода.

this.DoSomething(myObject);
// myObject will always point to the same instance here

this.DoSomething(ref myObject);
// myObject could potentially point to a completely new instance here

Ответ 4

В этом нет ничего особенного. Вы ссылаетесь на переменные, если хотите вернуть несколько значений из метода или просто не хотите переназначать возвращаемое значение объекту, который вы передали, в качестве аргумента.

Вот так:

int bar = 4;
foo(ref bar);

вместо:

int bar = 4;
bar = foo(bar);

Или если вы хотите получить несколько значений:

int bar = 0;
string foobar = "";
foo(ref bar, ref foobar);