三分之十的菜鸟C#学习小记(六) 引用ref和out

引用:ref和out

  • 引用

都是传递引用,相当于C++的&
ref和out的区别在于:

  1. ref传入方法的参数时,必须对该参数赋初值
  2. 在方法进行调用时,也要加关键词ref,out
  3. 被out修饰的变量使用前可以不初始化,因为即使初始化方法中也无法取得该值,但在方法中必须初始化(即使不使用)

out 比起 ref 来说,还有一个用法就是可以作为多返回值来用,都知道函数只能有一个返回值,C#里,如果你想让一个函数有多个返回值,那么OUT能很容易解决。

    static void Method(ref int i)
    {
        i = 44;				//3.如果采用out关键词,此时i必须赋值;如果没赋值而直接使用参数i,则抛出错误信息“使用了未赋值的out参数”,外面的值传不过来。ref可以
    }
    static void Main()
    {
        int val = 0;			//注意1.传参前,ref参数赋值
        Method(ref val);		//2.关键词ref
        // val is now 44
    }
  • 重载

尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。
因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。但是ref参数和普通参数,可以重载

{
    // ref和out重载:报错
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

{
	//ref和普通重载:可以
    public void SampleMethod(int i) { }
    public void SampleMethod(ref int i) { }
}
  • 传递数组
static void AddNumberOne(int[] a)	//传递的是数组的地址
static void AddNumberTwo(ref int[] a)	//一样

有一点注意:

// int[] Array = new int[] { 1, 2, 3, 4 };
static void AddNumberOne(int[] a)
        {
            a[0] = 10;
            //此时Array = {10, 2, 3, 4}
        }
static void AddNumberTwo(ref int[] a)
        {
            a[0] = 20;
            //此时Array = {20, 2, 3, 4}
        }
static void AddNumberThree(int[] a)
        {
            a = new int[10];
            a[0] = 30;
            //此时Array = {20, 2, 3, 4}
        }
static void AddNumberFour(ref int[] a)
        {
            a = new int[10];
            a[0] = 40;
            //此时Array = {40, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        }

这说明:

  1. 在传入数组名时,传递的是数组地址,直接改变原数组元素(ref和非ref一样)
  2. 第三个例子里,a = new之后,a的数值改变(如2312变成8790),但是由于传入的是拷贝,原Array地址还是2312,因此Array不变
  3. 第四个例子,a 和 Array是一个东西,a变成了8790,Array也是8790
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值