下面通过一个排序的小栗子来分析ref传递:

        static void Main(string[] args)
{
int [] arr=new int[]{,,,,};
int num;
Console.WriteLine("请输入您想插入的数据:");
if (int.TryParse(Console.ReadLine(), out num))
{
InsertValue( arr,num);
}
Console.WriteLine("-----------------------");
foreach (int a in arr)
{
Console.WriteLine(a);
}
Console.ReadKey();
} /// <summary>
/// 将制定数据插入到指定数组中
/// </summary>
/// <param name="arr"></param>
/// <param name="num"></param>
static void InsertValue( int[] arr1, int num)
{ //1.将数组扩容
int[] newArr = new int[arr1.Length + ];
arr1.CopyTo(newArr,);
//2.将数组重新引用
arr1 = newArr;
//3.获得插入位置
int position=;
for (int i = ; i < arr1.Length; i++)
{
if (num < arr1[i])
{
position = i;
break;
}
}
//4.将数据重新排列
for (int i = arr1.Length - ; i > position; i--)
{
arr1[i] = arr1[i - ];
}
arr1[position] = num;
}

这样输出的结果是:

显然我们的要插入的数据没有插进去,换句话说就是它输出的是原始的数组。对于数组的存储,数组名存储在栈空间,具体数组数据存储在堆空间,通过即时窗口可以看到:

即需要输出的数组arr的堆空间没有改变,所以输出的还是原始的没有插入数据的数组,这里其实应该改变为0x02332bc4,因为插入一个数据后的地址是0x02332bc4

ref关键字通过引用传递参数,通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中,但是使用ref传递的实参必须先初始化。

所以,这里我们可以在定义InsertValue时这样做: static void InsertValue( ref int[] arr1, int num),然后使用时:InsertValue(ref arr,num);就可以达到我们的效果了。

无论方法参数是值类型还是引用类型,均可由ref修改,当通过引用传递时,不会对值类型装箱(装箱即将值类型转换为引用类型)。

ref传递的更多相关文章

  1. ref和out 传递参数(C#)

    1.参数传递默认都是传递栈空间里面存储的内容 2.如果添加了ref那么传递的都是栈空间地址,而不再是栈空间里面的内容 3.如果添加了out,那么传递的也是栈空间的地址 //写一个方法计算一个int类型 ...

  2. C#使用ref和out传递数组

    C#使用ref和out传递数组 一.使用ref参数传递数组 数组类型的ref参数必须由调用方明确赋值.因此,接受方不需要明确赋值.接受方数组类型的ref参数能够修改调用方数组类型的结果.可以将接受方的 ...

  3. 使用 ref 和 out 传递数组注意事项

    1.与所有的 out参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由被调用方为其赋值 示例 :在此例中,在调用方(Main 方法)中声明数组 theArray,并在 FillArra ...

  4. C#学习系列-out与ref的区别

    参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9839&ct=31056 如 ...

  5. C#中的 ref 传进出的到底是什么 解惑篇

    今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问 另附言: 本文写于早上,就在想发布的那瞬间,靠,公司断网了,原来修改的部分丢失了. 网一断就是一天了 ...

  6. 关于ref与out的区别

    写在最前面 这几天一直在公司接受培训,都是一些基础的知识,同时也乘着这个机会巩固一下自己的基础,基础太重要了.前些时一直看的是多线程方面的知识,接下来我会写一些其他方面的知识,毕竟作为一个实习新人得和 ...

  7. in, out, ref

    C#中的函数传递方式可以为in.out.ref(引用) in方式的是默认的传递方式,即向函数内部传送值,不作讲解 很多语言都有类似的操作从函数向调用者返回值,这样我们可以通过函数的调用返回多个值,因为 ...

  8. C#中ref和out的使用小结

    ref传递的参数是变量的地址,在传入函数后,函数可以使用这些地址处的值,同时函数执行完后,这些变量被带回了调用者.ref传递的参数既可作传入值,也可作返回值. out传递的参数是变量的地址,在传入函数 ...

  9. C#的参数类型:params、out和ref

    parmas类型的参数 using System; public class MyClass { public static void UseParams(params int[] list) { ; ...

随机推荐

  1. C++开发者都应该使用的10个C++11特性

    转载自http://blog.jobbole.com/44015/ 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开 ...

  2. 黄聪:C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)

    一.各种旋转.改变大小 注意:先要添加画图相关的using引用. //向右旋转图像90°代码如下:private void Form1_Paint(object sender, System.Wind ...

  3. 内存修改console

    #include <stdio.h> #include <windows.h> #include <winuser.h> int main() { int cur_ ...

  4. 2016 Multi-University Training Contest 5 ATM Mechine

    ATM Mechine 本文转自:http://blog.csdn.net/queuelovestack/article/details/52096337 题意: 这题的意思还是比较费解的 Alice ...

  5. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  6. AD7190学习笔记

    1 建议SCL空闲时会高电平. 2复位:上电后连续输入40个1(时钟周期)复位到已知状态,并等待500us后才能访问串行接口,用于SCLK噪音导致的同步. 3单次转换与连续转换(连续读取):每次转换是 ...

  7. MySQL 绿色版安装方法图文教程

    一.下载,这里使用绿色解压缩版 http://mirror.services.wisc.edu/mysql/Downloads/MySQL-5.1/mysql-noinstall-5.1.32-win ...

  8. ios8消息快捷处理——暂无输入框

    if (isiOS8) { //ios8的远程推送注册 NSSet *set = nil; #if 1 //1.创建消息上面要添加的动作(按钮的形式显示出来) UIMutableUserNotific ...

  9. mongodb的python接口pymongo使用

    1. 连接 from pymongo import MongoClient client = MongoClient("mongodb://mongodb0.example.net:2701 ...

  10. nvelocity模板引擎

    using NVelocity.App;using NVelocity.Runtime;using NVelocity; VelocityEngine vltEngine = new Velocity ...