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

总结

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM