C# - 按值传递的引用

标签 c#

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

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

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

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

编辑 1 感谢您的回复,但如果我采用以下示例,则不会反射(reflect)更改。实际上,我正在尝试更改 A 的引用,但 A 的引用是按值传递的,因此在这种情况下,我理解为什么未反射(reflect)更改。

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

非常感谢。

最佳答案

基本上,当您传递一个对象时,传递的是一个引用:

When an object of a reference type is passed to a method, a reference to the object is passed. That is, the method receives not the object itself but an argument that indicates the location of the object. If you change a member of the object by using this reference, the change is reflected in the argument in the calling method, even if you pass the object by value.

您可以阅读更多关于此 MSDN page 的信息.


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

您可能需要记住的另一件事是 refoutref 将期望一个初始化值,并且该值在方法中被更改。 out 不关心它得到什么,但你需要在方法中初始化和设置它。

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

关于C# - 按值传递的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22959696/

相关文章:

c# - 使用基于 GetHashCode 的 Equals 有什么负面影响吗?

c# - 无法将 XML 反序列化为对象

c# - 由于数据包格式意外,握手失败

c# - Unity找不到部分类的构造函数

c# - Style 中的 Storyboard已完成事件?

c# - 如何在没有 Visual Studio 的机器上设置远程调试

c# - 登录应用程序的问题

c# - 使用 lambda 表达式替换正则表达式匹配

c# - 定义处理派生类集合的基类方法

c# - 如何找到与我的 C# 代码兼容的 Android 加密库或类?