ключевое слово 'ref' и домены приложений - PullRequest
7 голосов
/ 08 мая 2009

Когда я начал использовать C #, я не был уверен, как именно обрабатываются ссылки (передаются ли они по значению и т. Д.). Я ошибочно полагал, что ключевое слово 'ref' было необходимо при передаче объектов, которые будут изменены вызываемым методом.

Затем, прочитав темы типа this , я понял, что ref нужен только тогда, когда вам нужно изменить саму ссылку / указатель.

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

Я искал в сети и смог найти только одну страницу , в которой это кратко обсуждается. Является ли это известной проблемой, и может ли кто-нибудь указать на нее документацию? Мне кажется, что теперь мне придется использовать ref для любого параметра, который изменяется с помощью удаленного вызова.

Ответы [ 2 ]

4 голосов
/ 08 мая 2009

Добавление «ref» может или не может помочь. Все зависит от разумности конкретной маршаллерской реализации. Если вы вызываете, например, веб-сервис, никакие «ref» не помогут вам - параметры функции просто не будут отправлены обратно по проводам. Единственное, что возвращается из сервиса - это возвращаемое значение функции. Имея дело с удаленным взаимодействием, вы должны понимать (по крайней мере, до некоторой степени), как все работает на самом деле - тот факт, что параметры должны быть сериализованы и отправлены вызываемому абоненту по какому-то «проводу», десериализован на другом конце, работает выполняется сервером, а результаты сериализуются и отправляются обратно вам. Включение этих результатов в изменения параметров, которые вы в первую очередь передали, зависит в большей степени от конкретной реализации удаленного взаимодействия, а затем от "ссылок", которые вы добавляете для украшения своих параметров ...

1 голос
/ 08 мая 2009

Интересно, почему вы сказали «ссылка / указатель» ?. Есть большая разница между этими терминами. Видите, указатель - это просто адрес, скажем, int.

С другой стороны, ссылка - это не что иное, как псевдоним чего-либо. С точки зрения C ++:

int x;
int& y = x;

С этого момента, что бы ни случилось с x, случится с y и наоборот, они связаны "навсегда".

Опять же, в C ++, передача по ссылке:

void foo(int& y);
int main(){
    int x = 0;
    foo(x);
}

Это означает, что y, это просто другое имя (псевдоним) для x в области видимости foo. Это то, что ref означает в C #.

...