(Как уже упоминалось, это обман этот вопрос .)
Во-первых, он используется как часть перегрузки метода:
public void Foo(string x) { ... }
public void Foo(ref string x) { ... }
...
string x = "";
Foo(x); // Which should be used if you didn't have to specify ref?
Теперь одним из ответов может быть запрет такого рода перегрузки ... но я думаю, что для C # было бы хорошо требовать это на стороне вызывающего в качестве документации:
- Поведение значительно меняется при использовании
ref
(или out
)
- Вызывая редкие случаи использования ref / out, это означает, что вам никогда не нужно проверять
аргумент передается по значению или ссылке
- Это также влияет на то, что вы можете передать (например, вы не можете передать литерал или результат вызова метода). Это яснее, когда это явно.
Обратите внимание, что C # 4 допускает неявное использование ref
для методов COM, поскольку существует очень много ref
параметров, которые не действительно имеют поведение ref
(или, по крайней мере, они не воспользоваться этим). В таких случаях компилятор вводит новую локальную переменную, чтобы с точки зрения вызывающей стороны аргумент был передаваемым по значению:
ComMethod(x);
переводится в:
MyType tmp = x;
ComMethod (ref tmp);
Это хороший компромисс для методов COM, но я рад, что это не так для обычного управляемого кода.