Андрей прав; Я просто добавлю несколько дополнительных деталей.
Прежде всего, правильный способ подумать о параметрах out/ref состоит в том, что они являются алиасами для переменных. То есть, когда у вас есть метод M (ref int q) и называть его M (ref x), q и x равны двух разных имен для одной и той же переменной. Переменная - это место хранения; вы храните что-то в q, вы также храните его в x, потому что это два разных имени для одного и того же местоположения.
Во-вторых, альтернатива, которую вы описываете, называется ссылкой «копировать/копировать». В этой схеме есть два места хранения, а содержимое одного копируется при начале вызова функции и копируется обратно, когда это делается. Как вы заметили, семантика копирования-в-копии отличается от семантики ссылок псевдонимов при выдаче исключений.
Они также различны в странных ситуациях, как это:
void M(ref int q, ref int r)
{
q = 10;
r = 20;
print (q);
}
...
M(ref x, ref x);
В наложения спектров, X, Q и R все же место хранения, так что это печатает копию 20. В-в-копии-аута ссылки , это будет печатать 10, и конечное значение x будет зависеть от того, будет ли копирование слева направо или справа налево.
Наконец, если я правильно помню, в реализации деревьев выражений встречаются редкие и странные сценарии, где мы фактически реализуем семантику копирования-в-копировании по параметрам ref. Я должен рассмотреть этот код и посмотреть, могу ли я вспомнить, что именно происходит в этих сценариях.
Хм ... это не то, что я ожидал бы, но тест подтверждает это! +1. –
Это полезная информация. : O – Sapph
Я помню микрооптимизацию метода, который получил параметр 'out'. Метод был вызван в очень сложном цикле, и я хотел удалить требуемую инициализацию каждый раз, когда он был вызван, поскольку параметр не изменился, поэтому я заставил его принять параметр 'ref', и он выполнялся значительно хуже. У кого-нибудь есть объяснение, или это была случайность? – JulianR