c# - 方法Array.Clone是浅拷贝?

标签 c# .net

克隆是浅拷贝的一种方式。字符串是引用类型。为什么s2的改变不会影响s1?

    private void button3_Click(object sender, EventArgs e)
    {
        string[] s1 = { "a", "b" };
        string[] s2 = new string[2];

        s2 = (string[])s1.Clone();
         //s2=s1; //when Direct assignment s1 changed too
        s2[1] = "e";
        foreach (var s in s1)
        {
            this.richTextBox1.Text += s+",";
        }
        this.richTextBox1.Text += System.Environment.NewLine;

        foreach (var s in s2)
        {
            this.richTextBox1.Text += s + ",";
        }
    }
}

输出: 一个,乙, 一个,一个, 浅拷贝时,应该是:a,e, a,e

最佳答案

当您克隆 s1s2 时,它们是两个完全独立的对象,位于不同的位置。

s1[1] 持有对持有 b 的位置的引用,s2[1] 也是如此。然后,您为 s2[1] 分配一个不同的引用 - 一个到不同的位置。这不会以任何方式影响 s1[1]

毕竟,您还没有更改保存 b 的位置。


当您分配 s2 = s1; 时,两个变量都指向同一个对象 - 当您更改该对象时,两个变量都将反射(reflect)更改,因为它们指向同一个位置。

关于c# - 方法Array.Clone是浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165658/

相关文章:

c# - 如何在 .NET CF C# 3.5 中连接到 wifi 网络

asp.net - 当还安装了 NETFX 4.6.1 工具时,如何配置 Visual Studio 以使用 NETFX 4.7 工具

.net - Azure Cmdlet : String was not recognized as a valid Boolean

c# - 未找到结果时处理 ExecuteScalar 返回 null

c# - 如何在我的 ASP.NET Core MVC 应用程序中记录来自类库的 NLog 调用?

c# - 最小起订量从带参数的方法返回新对象

c# - Entity Framework 保存了太多的子实体

c# - 使用 AvalonEdit 进行语法高亮显示

.net - 如何防止第三方库显示 MessageBox?

c# - Azure WebJob 无法在 VS 2015 中运行?