gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:31:23 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com