You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中byte数组循环减法异常:a2与b2值始终相等问题求助

问题原因与解决方法

核心问题:数组的引用类型特性

在C#中,数组属于引用类型。当你执行byte[] b2 = a2;这行代码时,并没有生成新的数组副本,只是让变量b2和a2指向了内存中同一个数组对象。因此,对a2[x]的修改本质是直接修改这个共享数组的元素值,b2[x]读取的自然也是修改后的同一个元素,所以两者始终相等。

解决方法:创建数组的独立副本

要让b2成为a2的独立副本,需要显式复制数组内容,常用的几种方式如下:

方式1:使用Array.Copy

private void button1_Click(object sender, EventArgs e)
{
    byte[] a2 = GetRandomArray(8);
    byte[] b2 = new byte[a2.Length];
    Array.Copy(a2, b2, a2.Length); // 复制原数组内容到新数组

    for (int x = 0; x < 8; x++)
    {
        a2[x] = (byte)(a2[x] - 1);
        MessageBox.Show(a2[x].ToString() + "  |  " + b2[x].ToString());
    }
}

方式2:使用数组的Clone方法

private void button1_Click(object sender, EventArgs e)
{
    byte[] a2 = GetRandomArray(8);
    byte[] b2 = (byte[])a2.Clone(); // 克隆原数组生成新实例

    for (int x = 0; x < 8; x++)
    {
        a2[x] = (byte)(a2[x] - 1);
        MessageBox.Show(a2[x].ToString() + "  |  " + b2[x].ToString());
    }
}

方式3:使用LINQ的ToArray()(需引用System.Linq)

using System.Linq;

// ...

private void button1_Click(object sender, EventArgs e)
{
    byte[] a2 = GetRandomArray(8);
    byte[] b2 = a2.ToArray(); // 通过LINQ生成新数组副本

    for (int x = 0; x < 8; x++)
    {
        a2[x] = (byte)(a2[x] - 1);
        MessageBox.Show(a2[x].ToString() + "  |  " + b2[x].ToString());
    }
}

使用以上任意一种方式后,b2会成为独立于a2的新数组,修改a2的元素时,b2的元素会保持原随机值,两者的差异就能正常显示了。

内容的提问来源于stack exchange,提问作者user19195635

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:36:29