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++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
[问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...
随机推荐
- 使用FileSystemWatcher监听文件状态
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 一.FileSystemWatcher类型介绍 在.NET中使用 FileSystemWatcher 类型可以进行监视指定 ...
- Spring Boot 实践 :Spring Boot + MyBatis
Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...
- Canal搭建
目录 搭建环境 MySQL环境 Canal环境 客户端 总结 需求:解决私有环境数据库的基础数据同步问题,每当中心库基础数据发生改变时,其他私有库都会增量同步 Canal主要用途是基于 MySQL 数 ...
- kali 无线网络渗透测试
一.无线网络渗透嗅探工具Kismet 如果要进行无线网络渗透测试,则必须先扫描所有有效的无线接入点.在Kali linux中,提供了一款嗅探无线网络工具Kismet.使用该工具可以测量周围的无线信号, ...
- 普通 Docker 与 Kubernetes 对比
Docker提供基本容器管理 API 和容器镜像文件格式Kubernetes 管理运行容器的(物理或虚拟)主机群集,如果 Docker 是 OCP 的"内核",Kubernetes ...
- Linux关闭avahi-daemon服务
avahi-daemon是一种Linux操作系统上运行在客户机上实施查找基于网络的Zeroconf service的服务守护进程. 该服务可以为Zeroconf网络实现DNS服务发现及DNS组播规范. ...
- Linux sed工具的使用
基础知识 - 行编辑工具: 一行一行处理文件内容 - 全屏编辑工具:一次性将文件所有内容加载到内存中 sed编辑器: Stream Editor 工作原理: 逐行处理文件内容,一次读取一行内容到模式空 ...
- SpringMVC pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Homebrew安装(macos)
参照大佬的博客文章:https://zhuanlan.zhihu.com/p/111014448 OSX 将下面命令复制到终端执行 /bin/zsh -c "$(curl -fsSL htt ...
- springboot 中如何正确在异步线程中使用request
起因: 有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题. 示例代码: @GetMapping("/getParams&q ...