C#数组Copy探秘(附全码)_AX
【起源】
很久很久以前的一道笔试题:大意就是把一个个数组的数据copy到另一个数组中.我当时用的循环赋值.
这两天总在想这个问题,于是动手研究了一下下!
【方法】
①循环赋值:最直觉的做法,难道来源于C?数组不能直接copy.
②直接赋值:妈呀!这么原始野蛮简单的方法都行.真是不试不知道,一试吓一跳!!
③clone赋值:"克隆"真是项相当不错的技术,都弄到编程里来了,clone是首先出现在编程里还是出现在科学试验室里呢?
【总结】
方法①和③是建立副本(魔兽??),赋值后跟源脱离关系, 方法②是引用.其实就是源的另外一个变量名.
如果是②,不管你定义的数组长度是多少,赋值完成后都会与源相同.
【源码】
【测试结果】
很久很久以前的一道笔试题:大意就是把一个个数组的数据copy到另一个数组中.我当时用的循环赋值.
这两天总在想这个问题,于是动手研究了一下下!
【方法】
①循环赋值:最直觉的做法,难道来源于C?数组不能直接copy.
②直接赋值:妈呀!这么原始野蛮简单的方法都行.真是不试不知道,一试吓一跳!!
③clone赋值:"克隆"真是项相当不错的技术,都弄到编程里来了,clone是首先出现在编程里还是出现在科学试验室里呢?
【总结】
方法①和③是建立副本(魔兽??),赋值后跟源脱离关系, 方法②是引用.其实就是源的另外一个变量名.
如果是②,不管你定义的数组长度是多少,赋值完成后都会与源相同.
【源码】
1using System;
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11
12namespace AX
13{
14 /// <summary>
15 /// TestSimple 的摘要说明。
16 /// </summary>
17 public class TestSimple : System.Web.UI.Page
18 {
19 private void Page_Load(object sender, System.EventArgs e)
20 {
21 // 在此处放置用户代码以初始化页面
22 if(!this.IsPostBack)
23 {
24 //声明
25 int[] source={1,2,3,4};
26 int[] target=new int[6]; //OK
27// int[] target=null; //Bad
28// int[] target=new int[4]; //OK
29
30// int[] copy=new int[4];//OK
31// int[] copy=new int[2];//OK
32 int[] copy=new int[7];//OK
33 Response.Write("<font color=#ff7f00>copy的长度:"+copy.Length+"</font><br>");
34
35 //循环赋值,OK
36 for(int i=0;i<4;i++)
37 {
38 target[i]=source[i];
39 }
40 Response.Write("循环赋值target[1]="+target[1]+"<br>");
41
42 //直接赋值
43 copy=source;
44 Response.Write("直接赋值copy[1]="+copy[1]+"<br>");
45
46 //clone赋值 OK
47 int[] clone=(int[])source.Clone();
48
49 //改变数组copy元素的值
50 copy[1]=5;
51 Response.Write("<br><font color=red>改变copy[1]元素的值:<br>source[1]="+source[1]+"<br>target[1]="+target[1]+"<br>copy[1]="+copy[1]+"<br>clone[1]="+clone[1]+"</font><br>");
52
53 //改变数组clone元素的值
54 clone[1]=9;
55 Response.Write("<br><font color=6f4242>改变clone[1]元素的值:<br>source[1]="+source[1]+"<br>target[1]="+target[1]+"<br>copy[1]="+copy[1]+"<br>clone[1]="+clone[1]+"</font><br>");
56
57
58// //改变数组元素后进行clone赋值 OK
59// int[] clone=(int[])source.Clone();
60
61 //打印出copy的元素
62 Response.Write("<br>打印出copy的元素:");
63 foreach(int i in copy)
64 {
65 Response.Write(i);
66 }
67
68 //打印出clone的元素
69 Response.Write("<br>打印出clone的元素:");
70 foreach(int i in clone)
71 {
72 Response.Write(i);
73 }
74
75 //显示Copy的第6个元素.Bad
76// Response.Write("<br>copy的第6个元素:"+copy[5]);
77
78
79 Response.Write("<br>循环赋值target的长度和第6个元素值:"+target.Length+"||"+target[5]);
80
81 //显示Copy的长度
82 Response.Write("<br><font color=#ff7f00>copy的长度:"+copy.Length+"</font><br>");
83 }
84 }
85
86 Web 窗体设计器生成的代码
106 }
107}
108
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11
12namespace AX
13{
14 /// <summary>
15 /// TestSimple 的摘要说明。
16 /// </summary>
17 public class TestSimple : System.Web.UI.Page
18 {
19 private void Page_Load(object sender, System.EventArgs e)
20 {
21 // 在此处放置用户代码以初始化页面
22 if(!this.IsPostBack)
23 {
24 //声明
25 int[] source={1,2,3,4};
26 int[] target=new int[6]; //OK
27// int[] target=null; //Bad
28// int[] target=new int[4]; //OK
29
30// int[] copy=new int[4];//OK
31// int[] copy=new int[2];//OK
32 int[] copy=new int[7];//OK
33 Response.Write("<font color=#ff7f00>copy的长度:"+copy.Length+"</font><br>");
34
35 //循环赋值,OK
36 for(int i=0;i<4;i++)
37 {
38 target[i]=source[i];
39 }
40 Response.Write("循环赋值target[1]="+target[1]+"<br>");
41
42 //直接赋值
43 copy=source;
44 Response.Write("直接赋值copy[1]="+copy[1]+"<br>");
45
46 //clone赋值 OK
47 int[] clone=(int[])source.Clone();
48
49 //改变数组copy元素的值
50 copy[1]=5;
51 Response.Write("<br><font color=red>改变copy[1]元素的值:<br>source[1]="+source[1]+"<br>target[1]="+target[1]+"<br>copy[1]="+copy[1]+"<br>clone[1]="+clone[1]+"</font><br>");
52
53 //改变数组clone元素的值
54 clone[1]=9;
55 Response.Write("<br><font color=6f4242>改变clone[1]元素的值:<br>source[1]="+source[1]+"<br>target[1]="+target[1]+"<br>copy[1]="+copy[1]+"<br>clone[1]="+clone[1]+"</font><br>");
56
57
58// //改变数组元素后进行clone赋值 OK
59// int[] clone=(int[])source.Clone();
60
61 //打印出copy的元素
62 Response.Write("<br>打印出copy的元素:");
63 foreach(int i in copy)
64 {
65 Response.Write(i);
66 }
67
68 //打印出clone的元素
69 Response.Write("<br>打印出clone的元素:");
70 foreach(int i in clone)
71 {
72 Response.Write(i);
73 }
74
75 //显示Copy的第6个元素.Bad
76// Response.Write("<br>copy的第6个元素:"+copy[5]);
77
78
79 Response.Write("<br>循环赋值target的长度和第6个元素值:"+target.Length+"||"+target[5]);
80
81 //显示Copy的长度
82 Response.Write("<br><font color=#ff7f00>copy的长度:"+copy.Length+"</font><br>");
83 }
84 }
85
86 Web 窗体设计器生成的代码
106 }
107}
108
【测试结果】
少帮主的斧头好久不饮血了!