【问题标题】:C# Value and Reference typesC# 值和引用类型
【发布时间】:2014-05-31 05:41:47
【问题描述】:

请看下面提到的以下代码行:

byte[] a = { 1, 2, 3, 4 };
byte[] b = a; // b will have all values of a.
a = null; 

在 C# 中,byte[] 是一个引用类型。现在如果 a = null 在第 3 行,那么为什么 b 不为空,因为它是一个引用类型。如果我们检查b,它的所有值仍然是a

【问题讨论】:

标签: c# value-type reference-type


【解决方案1】:

首先,您在内存中的某处创建一个数组,例如从地址1000 开始。 a 是一个引用,它不包含数组,它包含地址1000b 也包含此地址。在第 3 行中,您将a 更改为指向null,但b 仍指向地址1000 中的数组。

您编辑了引用 (a),但没有编辑它引用的对象 ({1,2,3,4})。

【讨论】:

    【解决方案2】:

    reference types 实际上就是这样工作的。

    正如您所说,byte[] 是一个引用类型与所有其他数组一样。让我们逐行分析您的示例;

    byte[] a = { 1, 2, 3, 4 };
    

    --> 您在内存中创建了一个字节数组,a 是该数组的引用。

    byte[] b = a;
    

    -->您的ba 引用同一个对象,{ 1, 2, 3, 4 }它们是不同的引用

    a = null;
    

    --> 您的a 没有引用内存中的任何位置,但这不会影响b

    【讨论】:

    • 我知道我知道.. 我不擅长画画。
    【解决方案3】:

    您的问题假设您在分配时:

    byte[] b = a;
    

    你正在建立某种图形关联,如下所示:

    b -> a -> { 1, 2, 3, 4 }
    

    当您将a 分配给null 时,您会影响b 的值,因为:

    b -> a -> null
    

    但这不是复制引用的工作方式。当您复制引用时,您实际上是对 a 拥有的引用进行了 copy,如下所示:

    a ----> { 1, 2, 3, 4 }
                  ^
    b ------------|
    

    这就是为什么当您将a 分配给null 时,您不会影响b 的值,只会影响a

    a ----> null      { 1, 2, 3, 4 }
                              ^
    b ------------------------|
    

    【讨论】:

      【解决方案4】:

      您正在使b 指向包含byte 数组的内存地址。然后之后,您将a 指向nullb 保持不变。

      【讨论】:

        【解决方案5】:

        引用类型变量指向一个值。当您将一个 ref 类型变量分配给另一个时,您会将对其值的引用复制到变量本身。这就是b 仍然指向值表的原因。

        【讨论】:

          【解决方案6】:

          当一个类型为值类型时,表示该类型的变量存储的是实际数据。当一个类型是引用类型时,意味着该类型的变量存储了对实际数据的引用。

          在这两种情况下,从一个变量到另一个变量的赋值复制变量的内容。对于值类型,这意味着将值从一个变量复制到另一个变量,复制实际数据,从而创建一个新对象。对于引用类型,这意味着引用被复制从一个变量到另一个变量,复制引用但保持实际数据不变。强调一点:对象没有被复制,但引用是。引用的两个副本是独立的,尽管很容易观察到它们在取消引用时指向同一个对象。

          从这些你可以很容易地看到从一个变量到另一个变量的赋值复制了对字节数组的引用,所以你有两个对字节数组的引用。之后,当您将 null 分配给其中一个变量时,您正在复制对其的 null 引用,将原始引用(存储在该变量中)覆盖到字节数组中。所以,现在你没有两个对字节数组的引用,而只有一个 - 对象是相同的,但对它的引用是独立的。

          (同样,如果您将字节数组重新分配回空变量,这并不意味着程序中指向 null 的 所有 变量将指向字节数组 - 只有一个你分配的遗嘱。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-20
            • 2012-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多