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
相关产品推荐
相关产品推荐

