c# - 为什么当值类型是引用类型的属性时,它的行为就像引用类型?

标签 c# .net

为什么会这样:

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;
    }
}

结果

bc2.Value == true

由于 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;
}

但是它说它不是盒装的。我现在有点困惑,谁能给我解释一下?

最佳答案

Main 中只有一个 BoolClass 实例 - 用

创建的实例
BoolClass bc1 = new BoolClass { Value = false }

第二个变量 bc2 引用 BoolClass 的同一个实例,以及附加到该实例的所有属性。这是因为引用类型不会被复制。

OneInstance

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

关于c# - 为什么当值类型是引用类型的属性时,它的行为就像引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489404/

相关文章:

c# - 我可以使用 LINQ 从 List<String> 返回 List<Person>

c# - 在 C# 中是 bool 读/写原子

c# - 具有域驱动设计的 MVC .NET 表单

.net - 如何一次检查多个值的存在

c# - 删除自托管 Web Api 响应中的服务器 header

c# - 使用泛型语法的反射在重写方法的返回参数上失败

.net - 如何更改整个应用程序的默认 LookAndFeel?

c# - 从 : header 修改 FROM SMTP header 而不影响 MIME

c# - 为什么运行一百个异步任务比运行一百个线程花费的时间更长?

.net - 如何将自定义类的通用列表绑定(bind)到 datagridview 并仅在 VB.NET 中显示特定属性?