【发布时间】:2011-06-15 17:33:28
【问题描述】:
这似乎是一个愚蠢的问题,甚至是主观的,但我不确定这样做的正确方法是什么。
我有一个接收类并改变它的方法(特别是,它添加一个新列到 数据表)。我知道,使用引用类型时,我可以按值或按引用传递它,在这种情况下行为不会改变。
一方面,我不喜欢添加比需要更多的间接性。如果 by-val 有效,我喜欢使用它。
另一方面,by-ref 让我的意图更清晰(尽管方法的名称应该足够了)。
我应该使用哪个,为什么?
【问题讨论】:
这似乎是一个愚蠢的问题,甚至是主观的,但我不确定这样做的正确方法是什么。
我有一个接收类并改变它的方法(特别是,它添加一个新列到 数据表)。我知道,使用引用类型时,我可以按值或按引用传递它,在这种情况下行为不会改变。
一方面,我不喜欢添加比需要更多的间接性。如果 by-val 有效,我喜欢使用它。
另一方面,by-ref 让我的意图更清晰(尽管方法的名称应该足够了)。
我应该使用哪个,为什么?
【问题讨论】:
不,当引用类型参数为“按引用”时,行为确实会改变。这意味着调用者将看到对参数本身的更改。
如果您在不希望的情况下“通过引用”创建参数,则您的代码 less 清晰,而不是 more 清晰。它建议您将更改参数,而不仅仅是修改参数所指的对象。这也将限制如何调用您的方法,因为参数必须是左值。不是个好主意。
请查看我的article on parameter passing 了解更多信息。
【讨论】:
你不需要通过引用传递除非你想完全替换传递的实例。当您传递引用类型的实例时,被调用的方法将始终能够与其交互(更改属性值、调用方法等)。被调用的方法唯一不能做的就是用完全新的实例替换传递的实例,这种方式将反映在调用代码中。
【讨论】:
也许最好用一个例子来解释:
//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";
};
}
【讨论】: