【问题标题】:Pass reference variable by-ref or by-val?传递引用变量 by-ref 或 by-val?
【发布时间】:2011-06-15 17:33:28
【问题描述】:

这似乎是一个愚蠢的问题,甚至是主观的,但我不确定这样做的正确方法是什么。

我有一个接收类并改变它的方法(特别是,它添加一个新列到 数据表)。我知道,使用引用类型时,我可以按值或按引用传递它,在这种情况下行为不会改变。

一方面,我不喜欢添加比需要更多的间接性。如果 by-val 有效,我喜欢使用它。

另一方面,by-ref 让我的意图更清晰(尽管方法的名称应该足够了)。

我应该使用哪个,为什么?

【问题讨论】:

    标签: .net pass-by-reference


    【解决方案1】:

    不,当引用类型参数为“按引用”时,行为确实会改变。这意味着调用者将看到对参数本身的更改

    如果您在不希望的情况下“通过引用”创建参数,则您的代码 less 清晰,而不是 more 清晰。它建议您更改参数,而不仅仅是修改参数所指的对象。这也将限制如何调用您的方法,因为参数必须是左值。不是个好主意。

    请查看我的article on parameter passing 了解更多信息。

    【讨论】:

    • 无论如何,我在 VB 中思考,所以,AFAIK 在这种情况下 没有功能差异(只要我没有为参数分配任何东西)。这仍然是一个好点,因为将来可以从 C# 调用我的代码...
    • @Jaime:我怀疑您是否可以将另一个方法调用的结果作为 ByRef 参数的参数传递给方法。无论如何,我希望不会。我知道您可以在 VB 中通过引用传递属性,但我希望它不会走得更远。
    • @Jon Skeet:我担心你错了。我只是检查了它以确保它在 vs2005 和 2010 中即使 Option Strict On 也是允许的。
    • @Jaime:Ick。这很令人反感。我无法想象为什么允许这样做,除非是出于纯粹的历史原因。无论如何,不​​要这样做:)
    • 向后兼容性,我猜。 VB.Net 的“向后兼容性”让我很困惑。 “我们将以无数种突破性的方式改变语言,因为,你知道,vb6 很烂,但我们将保持 thisthis 只是为了嘲笑可怜的 coderz,mwahaha 。”我真的不明白。
    【解决方案2】:

    你不需要通过引用传递除非你想完全替换传递的实例。当您传递引用类型的实例时,被调用的方法将始终能够与其交互(更改属性值、调用方法等)。被调用的方法唯一不能做的就是用完全新的实例替换传递的实例,这种方式将反映在调用代码中。

    【讨论】:

    • 正如我所说,我已经理解了 by-ref 和 by-val 之间的区别。不过还是谢谢你的回答!
    【解决方案3】:

    也许最好用一个例子来解释:

        //pass by val because you are not changing the reference
        public void FillCustomer(Customer customer)
        {
            customer.Firstname = "Joe";
            customer.Surname = "Bloggs";
        }
    
        //pass by ref because you are changing the reference
        public void FillCustomer(ref Customer customer)
        {
            customer = new Customer
            {
                customer.Firstname = "Joe";
                customer.Surname = "Bloggs";
            };
        }
    

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2020-03-04
      相关资源
      最近更新 更多