为什么值类型在引用类型的属性时就像引用类型一样?

Ges*_*ess 4 .net c#

为什么这样:

public class BoolClass
{
    public bool Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        BoolClass bc1 = new BoolClass { Value = false };
        BoolClass bc2 = bc1;
        bc1.Value = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

造成

bc2.Value == true
Run Code Online (Sandbox Code Playgroud)

作为bool一种我预期的值类型,bc2.Value == false除非bc2.Value将其装箱并存储在堆上.

我在Stack Overflow上找到了这个方法来判断该值是否已装箱

public static bool IsBoxed<T>(T value)
{
    return 
        (typeof(T).IsInterface || typeof(T) == typeof(object)) &&
        value != null &&
        value.GetType().IsValueType;
}
Run Code Online (Sandbox Code Playgroud)

但它表示它没有盒装.我现在有些困惑,有人可以向我解释一下吗?

das*_*ght 8

BoolClassMain的创建只有一个实例

BoolClass bc1 = new BoolClass { Value = false }
Run Code Online (Sandbox Code Playgroud)

第二个变量bc2引用了与该实例相关的BoolClass所有属性的完全相同的实例.这是因为不会复制引用类型.

OneInstance

因此,只有一个Value属性,它属于BoolClass实例.通过对实例的两个引用都可以看到对该属性的任何操作.

  • @Gess完全正确.从本质上讲,装箱是一种将值嵌套在专门用于存储该类值的参考对象内的行为. (3认同)
  • 好吧,我看到将所述值类型从堆分配给另一个值类型确实是值类型行为的操作.也许我已经把它说得不好了.考虑到上面的例子,也许最好说_it看起来像值类型的行为类似于引用类型,因为它的封闭(父)引用类型. (2认同)