翼度科技»论坛 编程开发 .net 查看内容

C#中数组=out参数?

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
- 结论
  1. 先上结论,答案是yes,C#中数组确实具有out参数的特性。
复制代码
- 疑问
  1. 最近开发一个上位机的功能,有段代码看得我一直很迷糊,我的认识,函数的执行结果,要么在函数中通过return返回,要么通过out或ref参数返回。这段代码中明显没有通过return获取返回值,输入参数倒是看起来很像out返回值,但是我反复确认了N遍,定义就是没有out或ref类型。这就很是疑惑了,只好先放一边,先把它当做out参数取返回值理解去完成开发,今天有空终于把这个疑问摸清楚了。
复制代码
- 验证
  1. 各种百度,网上并没有答案。于是参照原来的代码写了一段Console程序,发现输入参数(字节数组)还真是在函数中更改后返回最新值了。此时原先的不明就里已经确定为就是【字节数组】的原因了,最初怀疑是Byte类型的原因,在程序中验证后发现并不是,然后用非字节类型的数组验证了下,仍然能在实参中取到函数更新后的值,确定为就是数组的原因。此时已经有点怀疑引用类型值类型的原因了,但是不对啊,平时引用类型string用的这么多,印象中并不会返回值啊,通过程序验证,也确定string参数没有out参数的特性,这就不得其解了。。直到搜到一篇文章,说string类型是一种特殊的引用类型,其实此处就等于是值传递,所有的谜团才清晰了。原因就在于参数分传值与传址两种,数组为引用类型,是按地址传递的,所以具备out参数的特性。
复制代码
点击查看代码
  1. class Pr
  2. {
  3.     private static byte[] m_byBuff = new byte[2048];
  4.     static void Main(string[] args)
  5.     {   
  6.         byte[] barr_read = new byte[1024];
  7.         int int_read = 0;
  8.         byte byte_read=0;
  9.         int[] iarr_read = new int[10];
  10.         string str_read = "0";
  11.         bool r = DataProcess(barr_read);
  12.         bool r1 = DataProcess(int_read);
  13.         bool r2 = DataProcess(byte_read);
  14.         bool r3 = DataProcess(str_read);
  15.         //向控制台输出
  16.         System.Console.WriteLine("数组类型实参传参后值(传参前为0,传参函数中有赋值):");
  17.         System.Console.WriteLine("arr[0]:{0}",barr_read[0].ToString());
  18.         System.Console.WriteLine("arr[1]:{0}", barr_read[1].ToString());
  19.         System.Console.WriteLine("arr[2]:{0}", barr_read[2].ToString());
  20.         System.Console.WriteLine("arr[3]:{0}", barr_read[3].ToString());
  21.         System.Console.WriteLine("int类型实参传参后值(传参前为0,传参函数中有赋值):");
  22.         System.Console.WriteLine(int_read.ToString());
  23.         System.Console.WriteLine("byte类型实参传参后值(传参前为0,传参函数中有赋值):");
  24.         System.Console.WriteLine(byte_read.ToString());
  25.         System.Console.WriteLine("string类型实参传参后值(传参前为‘0’,传参函数中有赋值):");
  26.         System.Console.WriteLine(str_read);
  27.     }
  28.     //Main是static的,因此aa也要申明为static,否则无法访问
  29.     private static bool DataProcess(byte[] outbuff)
  30.     {
  31.         outbuff[0] = (byte)1;
  32.         outbuff[1] = (byte)2;
  33.         outbuff[2] = (byte)3;
  34.         outbuff[3] = (byte)4;
  35.         return true;
  36.     }
  37.     private static bool DataProcess(int[] outbuff)
  38.     {
  39.         outbuff[0] = 11;
  40.         outbuff[1] = 12;
  41.         outbuff[2] = 13;
  42.         outbuff[3] = 14;
  43.         return true;
  44.     }
  45.     private static bool DataProcess(int outbuff)
  46.     {
  47.         outbuff=10;
  48.         return true;
  49.     }
  50.     private static bool DataProcess(byte outbuff)
  51.     {
  52.         outbuff = 20;
  53.         return true;
  54.     }
  55.     private static bool DataProcess(string outbuff)
  56.     {
  57.         outbuff = "30";;
  58.         return true;
  59.     }
  60. }
复制代码
- 参考

https://blog.csdn.net/weixin_44806070/article/details/107882525
https://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html

来源:https://www.cnblogs.com/liyangxiaomeng/archive/2023/07/08/17537531.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具