'ref'关键字和AppDomains

时间:2009-05-08 03:31:29

标签: c# remoting

当我开始使用C#时,我不确定如何正确处理引用(它们是否被值传递等)。我错误地认为在传递将被被调用方法修改的对象时需要'ref'关键字。

然后在阅读this之类的线程之后,我意识到只有当您需要更改实际的引用/指针本身时才需要'ref'。

但是今天我在通过远程调用传递参数时遇到了一个问题,其中实际上需要ref来修改对象的内容。在没有引用的情况下传递时,对象恢复原状。我被告知要添加ref关键字,但我争论了一段时间,只有在你更改指针本身时才需要它,而不是指向的内容。

我在网上搜索过,只能找到一个简短讨论它的single page。这是一个已知问题,是否有人能够指出一些有关它的文档?在我看来,我现在必须使用ref来通过远程调用修改任何参数。

2 个答案:

答案 0 :(得分:4)

添加“ref”可能会或可能没有帮助。这一切都取决于特定编组实现的智能性。例如,如果你打电话给一个网络服务,没有多少“参考”可以帮助你 - 函数的参数根本不会通过网络发回。从服务返回的唯一东西是函数的返回值。在处理远程处理时,你必须理解(至少在某种程度上)事物实际工作的方式 - 参数需要被序列化并通过某种“线路”发送给被调用者的事实,在另一端反序列化,工作由服务器执行,结果序列化并发送给您。这些结果是否包括对您首先传递的参数的更改取决于具体的远程处理实现,然后取决于您添加的“ref”以装饰您的参数......

答案 1 :(得分:1)

我想知道你为什么说“参考/指针”?这些条款之间存在很大差异。看,指针只是一个地址,比如一个int。

另一方面,引用只不过是某种东西的别名。就C ++而言:

int x;
int& y = x;

从这里开始,无论x发生什么,都发生在y和反之,他们被“永远”束缚。

同样,在C ++中,一个pass-by-ref:

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

这意味着y只是foo范围内x的另一个名称(别名)。这就是C#中的ref意思。