【问题标题】:'ref' keyword and AppDomains'ref' 关键字和 AppDomains
【发布时间】:2009-05-08 03:31:28
【问题描述】:

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

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

但是今天我在通过远程调用传递参数时遇到了一个问题,实际上需要 ref 来修改对象的内容。当没有 ref 传递时,对象原样返回。有人告诉我添加 ref 关键字,但我争论了一段时间,只有当您更改指针本身时才需要,而不是被指向的内容。

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

【问题讨论】:

    标签: c# remoting


    【解决方案1】:

    添加“ref”可能有帮助,也可能没有帮助。这完全取决于特定编组器实现的智能性。例如,如果您调用一个 Web 服务,那么再多的“ref”也无济于事——函数的参数根本不会通过网络传回。唯一从服务返回的是函数的返回值。在处理远程处理时,您必须了解(至少在某种程度上)事情的实际工作方式——参数需要序列化并通过某种“线路”发送到被调用方,在另一端反序列化,工作由服务器执行,并将结果序列化并发回给您。这些结果是否包括对您传递的参数的更改首先取决于特定的远程处理实现,然后取决于您添加以装饰参数的“ref”...

    【讨论】:

    • 我很确定 SOAP (asmx) 和 WCF Web 服务都会像您期望的那样处理“ref”,方法是在两个方向上编组它。
    【解决方案2】:

    我想知道你为什么说“引用/指针”?这些术语之间有很大的不同。看,指针只是一个地址,比如说一个 int。

    另一方面,引用只不过是某物的别名。在 C++ 方面:

    int x;
    int& y = x;
    

    从这里开始,无论 x 发生什么,y 发生什么,反之亦然,它们都被“永远”绑定。

    同样,在 C++ 中,传递引用:

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

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

    【讨论】:

    • 这是 ref 的意思,但不是 reference 的意思。我认为将 C++ 引入混合中会让人感到困惑,因为 C++ 引用与 C# 引用并不完全相同。
    • 我在这里说的是“引用/指针”,而不仅仅是“引用”,以强调我说的是实际引用,而不是引用所引用的对象。认为这可能有助于避免人们重复阅读句子。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2010-10-28
    • 2010-12-31
    • 2023-03-28
    • 2010-09-28
    • 2011-01-12
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多