c# - 将包含类实例的结构体的变量分配给另一个变量

标签 c# class struct value-type reference-type

根据我的理解,将结构体的变量分配给相同类型的另一个变量将生成一个副本。但如下图所示,这条规则似乎被打破了。您能解释一下为什么会发生这种情况吗?

enter image description here

using System;

namespace ReferenceInValue
{
    class Inner
    {
        public int data;
        public Inner(int data) { this.data = data; }
    }

    struct Outer
    {
        public Inner inner;
        public Outer(int data) { this.inner = new Inner(data); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Outer p1 = new Outer(1);
            Outer p2 = p1;
            Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);


            p1.inner.data = 2;
            Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);


            p2.inner.data = 3;
            Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);

            Console.ReadKey();
        }
    }
}

最佳答案

您在主题中回答了您的问题。

你的结构体包含一个引用,当复制该结构体时,它会被复制为一 block 内存,包括引用(而不是被引用的对象),就像引用是一个整数或另一个基元一样。

复制结构不会导致克隆。

事实上,在结构中放置引用是一个坏主意,应该避免。 一个异常(exception)是不可变的引用对象(例如字符串),它们可以“安全”地放置在结构中,因为它们无法修改,但是您仍然会失去内存中的局部性。

请记住,值类型在其定义范围内本地存储,引用类型始终存储在堆上,而引用则在其定义范围内本地存储。

关于c# - 将包含类实例的结构体的变量分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487014/

相关文章:

c# - 改变控制台颜色,给我一个 Stackoverflow 异常

c# - 有效删除 SortedSet<T> 中的第一个元素

c# - vb.net 和 C# 问题中的编码差异

java - 如何将 python struct.unpack 转换为 java

c# - SQL Server + Entity Framework 基础知识

c# - 在 Entity Framework 中通过原始 SQL 查询获取复杂对象

C++ 基于上下文的类实现

c++ - 两个类的字段互相指向可以吗?

结构指针地址比较不起作用

c++ - 如何使用自定义结构初始化 boost::array?