快速提问: 我正在将类(引用类型)传递给方法而不使用“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;
}
非常感谢。
答案 0 :(得分:3)
基本上,当你传递一个对象时,会传递一个引用:
将引用类型的对象传递给方法时,将传递对该对象的引用。也就是说,该方法不接收对象本身,而是接收指示对象位置的参数。如果使用此引用更改对象的成员,则更改将反映在调用方法的参数中,即使您按值传递对象也是如此。
您可以在此MSDN page上阅读更多内容。
您可以阅读其他答案的更多信息,但请注意您正在返回课程。通常你会返回一个特定的对象类型,当你不会那么自由地做那样愚蠢的事情。 (当然,假设B
继承自A
,您可以在方法中创建一个新的B
并返回它,这将是有效的,但仍然没有意义)。
您可能想要记住的另一件事是ref
和out
。
ref
将期望初始值,并且该值在方法中更改。
out
并不关心它的内容,但您需要在方法中初始化并设置它。
除此之外,其他答案在这里,或者更具体地说明您的问题和代码,或者阅读答案中的不同链接:)
答案 1 :(得分:1)
您正在使用可变变量(更准确地说是参数A
)将引用(不可变值)传递给方法。然后,为可变变量A
分配一个新值,即对新创建的对象的不可变引用。最后,您将返回变量A
的当前值,该变量在此时是对新对象的引用,而不再是对传递给方法的对象的引用。
基本上,您会混淆变量和存储在该变量中的值。您没有更改任何引用,您只交换了存储在变量中的值,即引用。
答案 2 :(得分:1)
当您按值传递引用类型时,尝试将参数重新分配给其他内存位置只能在方法内部工作,并且不会影响原始变量。