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
总结
直接赋值的方式性能明显强于其他的语法糖。
C# 数组 深拷贝 和 数组传参的更多相关文章
- Java学习小结(1)-数组的创建与传参
(一)数组的创建 数组的创建包括两部分:数组的申明与分配内存空间. int score[]=null; //申明一维数组 score=new int[3]; //分配长度为3的空间 数组的申明还有另外 ...
- C# Array 基本数据类型数组的基类 传参问题
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- c++数组传参
最近感觉老是碰到数组传参的问题,特别是二维的数组,每次报错都感觉头疼,烦躁:这里必须总结一下了,先把暂时能解决的问题写在这吧,以便以后碰到查看! 先看一个一维数组传参:这样用数组传参是很不安全的:会输 ...
- c/c++ 数组传参
在c/c++中,在进行数组传参时,数组的元素个数默认是不作为实参传入调用函数,也就是说c/c++ 不允许向函数传递一个完整的数组作为参数 实例: 1.形式参数是一个指针,实参包括数组长度: 1 voi ...
- C和C++引用传递和数组传参引用
引用传递有两种传参方式,具体可参考文章 概括地讲,就是 *声明一个形参是指针,所以需要传递指针实参,对应的函数实现也应当遵循指针的语法.这种实现思路并不针对于C或者C++,因为它们都有指针,所以都可以 ...
- 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历
/************************************************************************* > File Name: message.c ...
- 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
[问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...
随机推荐
- Vue引入vuetify框架你需要知道的几点
1.命令行安装 npm install vuetify --save 2.在src目录中创建一个名为的文件夹plugins在里面,添加一个vuetify.js文件.代码如下 import Vue fr ...
- JavaScript中DOM查询封装函数
在JavaScript中可以通过BOM查询html文档中的元素,也就是所谓的在html中获取对象然后对它添加一个函数. 常用的方法有以下几种: ①document.getElementById() 通 ...
- Mysql安装配置以及解决重装Mysql时忘记root password问题
目录 1.Mysql安装以及环境变量配置 重装Mysql时忘记root password问题 1.Mysql安装以及环境变量配置 官网安装:https://www.mysql.com/ 按 ...
- Mybatis中@select注解联合查询
前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...
- 入门Python数据分析最好的实战项目(一)分析篇
数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seaborn,以及机器学习包sklearn. python学习交流群:660193417### import ...
- 强化学习-学习笔记5 | AlphaGo
本文不是论文阅读笔记,只是一个学习笔记,重在理解,在严谨程度上可能稍差. AlphaGo 论文指路: Mastering the game of Go with deep neural network ...
- 什么是pytorch?
Pytorch是基于python的科学计算包,为两类受众提供服务 作为Numpy的替换,让你可以使用GPU的算力 作为一个深度学习计算平台提供最大的计算灵活性与速度 开始体验pytorch的基础功能 ...
- mysql导出导入数据库和表学习笔记
一.mysql导出数据库和表 1.导出单个数据库 mysqldump [-h Host] -u Username -p [PASSWORD] db_name > db_name.sql 2.导出 ...
- 注解_概念和注解_JDK内置注解
注解: 概念:说明程序的,给计算机看的 注解:用文字描述程序的,给程序员看的 定义:注解(Annotation),也叫元数据.一种代码级别的说明.他是JDK1.5及以后的版本引入的一个特性,与类,接口 ...
- Mac os:将Homebrew的下载源换成国内镜像增加下载速度(阿里云镜像)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_135 可能所有的mac os系统爱好者都遇到过下面这种倒霉情况,在网络环境不太好的时候,你满怀期待的敲下 brew install ...