C# - 按值传递的引用

时间:2014-04-09 10:25:05

标签: c#

快速提问: 我正在将类(引用类型)传递给方法而不使用“ref”关键字。因此,我的类的引用本身是通过值传递的。 然后,我改变了我的类的引用(我将引用指向我方法中定义的另一个实例)。

最后,我返回初始方法。但是,在这种情况下,返回的实例指向第二个类的实例。

public Class Foo(Class A)
{
    Class B = new Class();
    A = B; 
    return A; 
}

Foo返回指向B的引用! 我有点困惑,因为当做A = B时我将A点的引用引用到另一个引用,或者引用的A是按值传递的。

编辑1 感谢您的回复,但如果我采用以下示例,则不会反映更改。实际上,我正在尝试更改A的引用,但是A的引用是通过值传递的,因此在这种情况下,我理解为什么更改没有反映出来。

void Foo(Class A)
{
    A = null; 
}

非常感谢。

3 个答案:

答案 0 :(得分:3)

基本上,当你传递一个对象时,会传递一个引用:

  

将引用类型的对象传递给方法时,将传递对该对象的引用。也就是说,该方法不接收对象本身,而是接收指示对象位置的参数。如果使用此引用更改对象的成员,则更改将反映在调用方法的参数中,即使您按值传递对象也是如此。

您可以在此MSDN page上阅读更多内容。


您可以阅读其他答案的更多信息,但请注意您正在返回课程。通常你会返回一个特定的对象类型,当你不会那么自由地做那样愚蠢的事情。 (当然,假设B继承自A,您可以在方法中创建一个新的B并返回它,这将是有效的,但仍然没有意义)。

您可能想要记住的另一件事是refoutref将期望初始值,并且该值在方法中更改。 out并不关心它的内容,但您需要在方法中初始化并设置它。

除此之外,其他答案在这里,或者更具体地说明您的问题和代码,或者阅读答案中的不同链接:)

答案 1 :(得分:1)

您正在使用可变变量(更准确地说是参数A)将引用(不可变值)传递给方法。然后,为可变变量A分配一个新值,即对新创建的对象的不可变引用。最后,您将返回变量A的当前值,该变量在此时是对新对象的引用,而不再是对传递给方法的对象的引用。

基本上,您会混淆变量和存储在该变量中的值。您没有更改任何引用,您只交换了存储在变量中的值,即引用。

答案 2 :(得分:1)

当您按值传递引用类型时,尝试将参数重新分配给其他内存位置只能在方法内部工作,并且不会影响原始变量。

查看Passing reference - type parameters .