C#数组Copy探秘(附全码)_AX
【起源】
很久很久以前的一道笔试题:大意就是把一个个数组的数据copy到另一个数组中.我当时用的循环赋值.
这两天总在想这个问题,于是动手研究了一下下!
【方法】
①循环赋值:最直觉的做法,难道来源于C?数组不能直接copy.
②直接赋值:妈呀!这么原始野蛮简单的方法都行.真是不试不知道,一试吓一跳!!
③clone赋值:"克隆"真是项相当不错的技术,都弄到编程里来了,clone是首先出现在编程里还是出现在科学试验室里呢?
【总结】
方法①和③是建立副本(魔兽??),赋值后跟源脱离关系, 方法②是引用.其实就是源的另外一个变量名.
如果是②,不管你定义的数组长度是多少,赋值完成后都会与源相同.
【源码】
【测试结果】
很久很久以前的一道笔试题:大意就是把一个个数组的数据copy到另一个数组中.我当时用的循环赋值.
这两天总在想这个问题,于是动手研究了一下下!
【方法】
①循环赋值:最直觉的做法,难道来源于C?数组不能直接copy.
②直接赋值:妈呀!这么原始野蛮简单的方法都行.真是不试不知道,一试吓一跳!!
③clone赋值:"克隆"真是项相当不错的技术,都弄到编程里来了,clone是首先出现在编程里还是出现在科学试验室里呢?
【总结】
方法①和③是建立副本(魔兽??),赋值后跟源脱离关系, 方法②是引用.其实就是源的另外一个变量名.
如果是②,不管你定义的数组长度是多少,赋值完成后都会与源相同.
【源码】
1
using System;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Web;
7
using System.Web.SessionState;
8
using System.Web.UI;
9
using System.Web.UI.WebControls;
10
using System.Web.UI.HtmlControls;
11![]()
12
namespace 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![]()
using System;2
using System.Collections;3
using System.ComponentModel;4
using System.Data;5
using System.Drawing;6
using System.Web;7
using System.Web.SessionState;8
using System.Web.UI;9
using System.Web.UI.WebControls;10
using System.Web.UI.HtmlControls;11

12
namespace AX13
{14
/// <summary>15
/// TestSimple 的摘要说明。16
/// </summary>17
public class TestSimple : System.Web.UI.Page18
{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]; //OK27
// int[] target=null; //Bad28
// int[] target=new int[4]; //OK29

30
// int[] copy=new int[4];//OK31
// int[] copy=new int[2];//OK32
int[] copy=new int[7];//OK33
Response.Write("<font color=#ff7f00>copy的长度:"+copy.Length+"</font><br>");34

35
//循环赋值,OK36
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赋值 OK47
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赋值 OK59
// 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个元素.Bad76
// 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

【测试结果】
少帮主的斧头好久不饮血了!


浙公网安备 33010602011771号