深拷贝、浅拷贝、new?多线程参数传值问题

梦里开天 2009-09-26 04:23:26
多线程某个函数被频繁调用,调试发现,参数在不同时间,其值在发生变化,比如传入一个byte数组A,进去时候是一个值,运行中也是一个值,值会随函数外部计算或其他线程而改变,从而影响本线程本函数的求值计算。
现在发现2种方式:
1: 后来在函数内声明新的byte数组B用A进行赋值,函数内只用B进行计算等。(问:此处A是否用new在次分配?)
2: 后来发现有深拷贝是不是和new效果一样?
...全文
152 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦里开天 2009-09-26
  • 打赏
  • 举报
回复

yte[] a1copy =new byte[a1.Length];
Array.Copy(a1,a1copy,2);

这也行
梦里开天 2009-09-26
  • 打赏
  • 举报
回复

public void seta(byte[] a1)
{
//方法一:a1被改
//byte[] a1copy = a1;//无效
//方法二;a1被改
//byte[] a1copy =new byte[a1.Length]; //无效
//a1copy=a1;
//方法三:克隆a1未被改
//byte[] a1copy =new byte[a1.Length];
//a1copy=(byte[])(a1.Clone());
//方法四:克隆a1未被改
//byte[] a1copy =new byte[a1.Length];
//a1.CopyTo(a1copy,0);
//以上方法打开一种测试
a1copy[0] = 9;//无效
a = a1copy;
}

做了个测试,发现new没用,copyto和克隆比较安全。
梦里开天 2009-09-26
  • 打赏
  • 举报
回复
一到多线程真的牵扯到很多问题啊!!!!!
数组是作为引用传递,所以函数内不能对其进行更改
q512362091 2009-09-26
  • 打赏
  • 举报
回复
顶起 学习下
梦里开天 2009-09-26
  • 打赏
  • 举报
回复
    public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
A aa =new A();
byte[] b ={ 1,2};
aa.seta(b);
label1.Text ="b="+ b[0].ToString();
label2.Text = "A.a=" + aa.a[0].ToString();
}
}
public class A
{
public byte []a;

public void seta(byte[] a1)
{
a1[0] = 9;
a=a1;
}
}

结果是;b[0]=9;A.a[0]=9;
然而参数是int 或string等类型就不会出现此问题。
这是不是说明数组作为参数是指针类型呢???
梦里开天 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gisyellow 的回复:]
深拷贝对于对象类型来说,就是new,不过会将所有值都复制。
[/Quote]
那就是
byte[] B;
B=A;

byte[] B=new byte[A.length];
B=A;
效果一样喽?
gisyellow 2009-09-26
  • 打赏
  • 举报
回复
深拷贝对于对象类型来说,就是new,不过会将所有值都复制。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧