C#中数组=out参数?
- 结论
先上结论,答案是yes,C#中数组确实具有out参数的特性。
- 疑问
最近开发一个上位机的功能,有段代码看得我一直很迷糊,我的认识,函数的执行结果,要么在函数中通过return返回,要么通过out或ref参数返回。这段代码中明显没有通过return获取返回值,输入参数倒是看起来很像out返回值,但是我反复确认了N遍,定义就是没有out或ref类型。这就很是疑惑了,只好先放一边,先把它当做out参数取返回值理解去完成开发,今天有空终于把这个疑问摸清楚了。
- 验证
各种百度,网上并没有答案。于是参照原来的代码写了一段Console程序,发现输入参数(字节数组)还真是在函数中更改后返回最新值了。此时原先的不明就里已经确定为就是【字节数组】的原因了,最初怀疑是Byte类型的原因,在程序中验证后发现并不是,然后用非字节类型的数组验证了下,仍然能在实参中取到函数更新后的值,确定为就是数组的原因。此时已经有点怀疑引用类型值类型的原因了,但是不对啊,平时引用类型string用的这么多,印象中并不会返回值啊,通过程序验证,也确定string参数没有out参数的特性,这就不得其解了。。直到搜到一篇文章,说string类型是一种特殊的引用类型,其实此处就等于是值传递,所有的谜团才清晰了。原因就在于参数分传值与传址两种,数组为引用类型,是按地址传递的,所以具备out参数的特性。
点击查看代码
class Pr
{
private static byte[] m_byBuff = new byte[2048];
static void Main(string[] args)
{
byte[] barr_read = new byte[1024];
int int_read = 0;
byte byte_read=0;
int[] iarr_read = new int[10];
string str_read = "0";
bool r = DataProcess(barr_read);
bool r1 = DataProcess(int_read);
bool r2 = DataProcess(byte_read);
bool r3 = DataProcess(str_read);
//向控制台输出
System.Console.WriteLine("数组类型实参传参后值(传参前为0,传参函数中有赋值):");
System.Console.WriteLine("arr[0]:{0}",barr_read[0].ToString());
System.Console.WriteLine("arr[1]:{0}", barr_read[1].ToString());
System.Console.WriteLine("arr[2]:{0}", barr_read[2].ToString());
System.Console.WriteLine("arr[3]:{0}", barr_read[3].ToString());
System.Console.WriteLine("int类型实参传参后值(传参前为0,传参函数中有赋值):");
System.Console.WriteLine(int_read.ToString());
System.Console.WriteLine("byte类型实参传参后值(传参前为0,传参函数中有赋值):");
System.Console.WriteLine(byte_read.ToString());
System.Console.WriteLine("string类型实参传参后值(传参前为‘0’,传参函数中有赋值):");
System.Console.WriteLine(str_read);
}
//Main是static的,因此aa也要申明为static,否则无法访问
private static bool DataProcess(byte[] outbuff)
{
outbuff[0] = (byte)1;
outbuff[1] = (byte)2;
outbuff[2] = (byte)3;
outbuff[3] = (byte)4;
return true;
}
private static bool DataProcess(int[] outbuff)
{
outbuff[0] = 11;
outbuff[1] = 12;
outbuff[2] = 13;
outbuff[3] = 14;
return true;
}
private static bool DataProcess(int outbuff)
{
outbuff=10;
return true;
}
private static bool DataProcess(byte outbuff)
{
outbuff = 20;
return true;
}
private static bool DataProcess(string outbuff)
{
outbuff = "30";;
return true;
}
}
- 参考
https://blog.csdn.net/weixin_44806070/article/details/107882525
https://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html
C#中数组=out参数?的更多相关文章
- C++ 中数组做参数的分析
C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...
- C++中多维数组传递参数
在c++自定义函数时我们有时需要传递参数,有时以多维数组作为参数,这里就遇到了多维数组该怎么传值的问题了,首先我们看看一维数组是怎么做的. void print_num(int num[], int ...
- MyBatis中foreach传入参数为数组
一.当只有一个参数,并且这个参数是数组时 接口方法的参数不需要添加@Param注释,collection="array" 示例 接口的方法 void deleteMulti(Str ...
- 利用apply()或者rest参数来实现用数组传递函数参数
关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- C++程序设计(关于函数中数组传递的一点心得)
题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分: ...
- javascript中数组和字符串的方法比较
× 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...
- C#中方法的参数的四种类型
C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修 ...
- html代码中的form参数是基本一致的
由于pear的大多数模块仍处于开发当中,因此,这里列举的是随着php4.05一起发布的pear中的模块,需要注意的是,一些抽象类或者是基类(如mail.php,log.php,cache.php)没有 ...
随机推荐
- 四月九号java知识
1.do{}while();和while(){}结构最主要区别就是前者后面要一个分号 2.System.out.print();与System.out.println();的区别后者输出换行, 前者不 ...
- 解密prompt系列5. APE+SELF=自动化指令集构建代码实现
上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 介绍两种方案SELF Instruct和A ...
- [GAUSS-50201]:The /opt/software/openGauss/xxxx-RedHat-64bit.tar.bz2 does not exist
问题描述:使用redhat7.9来安装opengauss集群,预安装过不去.opengauss官方只支持centos版本,最好是centos7.6. [root@db01 script]# ./gs_ ...
- TiDB在X86和ARM混合平台下的离线部署和升级
[是否原创]是 [首发渠道]TiDB 社区 背景 在之前我们团队发布了TiDB基于X86和ARM混合部署架构的文章:TiDB 5.0 异步事务特性体验--基于X86和ARM混合部署架构,最近有朋友问到 ...
- Vue项目使用Echarts来实现中国地图,省份显示
当时做的时候参考了CSND博主:接口写好了吗 第一步:下载echarts npm install echarts --save main.js中引入 import * as echarts fr ...
- 一天吃透SpringBoot面试八股文
Springboot的优点 内置servlet容器,不需要在服务器部署 tomcat.只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目 SpringBoot提供了s ...
- KMP字符串匹配问题
KMP算法 本文参考资料:https://www.zhihu.com/question/21923021 KMP算法是一种字符串匹配算法,可以在 \(O(n+m)\) 的时间复杂度内实现两个字符串的匹 ...
- 收藏!最全Linux思维导图
收藏!最全Linux思维导图 目录 收藏!最全Linux思维导图 1. 认识 Linux 2. Linux 命令 3. Linux学习路径 4. Linux 桌面介绍 5. FHS:文件系统目录标准 ...
- pytest数据参数化和数据驱动yaml的简单使用
Pytest参数化 @pytest.mark.parametrize(argnames, argvalues) argnames: 要参数化的变量, string(逗号分隔), list, tuple ...
- 2020-10-30:给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?
福哥答案2020-10-30:1.双重遍历法.2.一次遍历法.golang代码如下: package main import "fmt" const INT_MAX = int(^ ...