C#中数组做为函数参数,加不加ref有何区别?

问题:

int GetCardCompareCurrentPointExtern(int CardNo, int[] pos); int GetCardCompareCurrentPointExtern(int CardNo, ref int[] pos); 上面是C#的两个函数定义。  由于int数组本身会传地址,因此不需要加ref。


这个问题细想一下还真是个知识盲点。



在 C# 中,数组是引用类型(reference type),这意味着当你传递一个数组作为参数时,实际上传递的是数组的引用(内存地址),而不是数组的副本。因此,在大多数情况下,确实不需要使用 ref 关键字来传递数组。

具体分析:

  1. 不加 ref 的情况

    csharp
    复制
    int GetCardCompareCurrentPointExtern(int CardNo, int[] pos);
    • 这里传递的是数组的引用。

    • 你可以在方法内部修改数组的内容(例如修改数组元素的值)。

    • 但是,如果你尝试重新分配 pos(例如 pos = new int[10];),这不会影响调用方的数组引用,因为只是修改了方法内部的局部变量。

  2. 加 ref 的情况

    csharp
    复制
    int GetCardCompareCurrentPointExtern(int CardNo, ref int[] pos);
    • 这里传递的是数组引用的引用(即引用的地址)。

    • 你不仅可以在方法内部修改数组的内容,还可以重新分配数组(例如 pos = new int[10];),这会影响调用方的数组引用。

是否需要加 ref

  • 如果你只需要修改数组的内容(例如修改元素的值),不需要加 ref

  • 如果你需要重新分配数组(例如创建一个新数组并希望调用方也能看到这个新数组),需要加 ref

示例:

csharp
复制
void ModifyArray(int[] arr){
    arr[0] = 100; // 修改数组内容,调用方会看到变化
    arr = new int[10]; // 重新分配数组,调用方不会看到变化}void ModifyArrayWithRef(ref int[] arr){
    arr[0] = 100; // 修改数组内容,调用方会看到变化
    arr = new int[10]; // 重新分配数组,调用方会看到变化}

总结:

  • 如果只是修改数组内容,不需要加 ref

  • 如果需要重新分配数组(改变数组引用),需要加 ref

因此,你的理解是正确的,但需要明确区分“修改数组内容”和“重新分配数组引用”这两种情况。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864