Loading

C# 数组 深拷贝 和 数组传参

前言

C#中引用类型无法使用const,因此传参的时候使用引用类型,一定要注意是否会改变其值。下面介绍几种 数组的 深拷贝方法。

前提

下面的测试代码有一些前提,

  • sw为Stopwatch
  • nForTimes在这里为10000000

1.Array.Copy(sourceArray, destArray, length)

int[] nArray = new int[4] { 11, 22, 33, 44 };

int[] copyArray = new int[4];

sw.Start();
for (int i = 0; i < nForTimes; i++)
{
	Array.Copy(nArray, copyArray, 4);
}

sw.Stop();

decimal dCopy = sw.ElapsedTicks / (decimal)Stopwatch.Frequency;

Console.WriteLine(dCopy);
  • copy方法运行时间:0.3301541

2.Array.Clone()

int[] cloneArray = new int[4];

sw.Restart();

for (int i = 0; i < nForTimes; i++)
{
	cloneArray = (int[])nArray.Clone();
}

sw.Stop();

decimal dClone = sw.ElapsedTicks / (decimal)Stopwatch.Frequency;

Console.WriteLine(dClone);
  • clone方法运行时间:0.8257813

    因为有明显的强制类型转换,所以耗时较长

3.Array.CopyTo

int[] copytoArray = new int[4];

sw.Restart();

for (int i = 0; i < nForTimes; i++)
{
	nArray.CopyTo(copytoArray, 0);
}

sw.Stop();

decimal dCopyTo = sw.ElapsedTicks / (decimal)Stopwatch.Frequency;

Console.WriteLine(dCopyTo);
  • copyto运行时间:0.3313199

4.直接赋值

int[] nDefineArray = new int[4];

sw.Restart();

for (int i = 0; i < nForTimes; i++)
{
    for (int j = 0; j < 4; j++)
    {
    	nDefineArray[j] = nArray[j];
    }
}

sw.Stop();

decimal dDefine = sw.ElapsedTicks / (decimal)Stopwatch.Frequency;

Console.WriteLine(dDefine);
  • 直接赋值运行时间:0.0785752

总结

直接赋值的方式性能明显强于其他的语法糖。

posted @ 2021-03-27 11:30  ligiggy  阅读(697)  评论(1编辑  收藏  举报