最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

C#函数参数中ref和out的使用方法与区别

CSharp 宇托 511浏览 暂无评论

在C#中,我经常用到refout这两个关键字,但对其区别也还不是很清楚。

基本上来说,C#函数参数的传递方法为分两种,一种转值,另一种是传址。对于不加任何修饰的函数参数来说,它都是传值的。传值又分为两种,一种是传对象值,另一种是传地址值。对于值类型System.ValueType(包括这两种structenum,C#中的intdouble等基本类型都是struct)来说是传对象值,对于其它对象来说是传地址值。

在加了修饰refout之后,函数参数就是传址的。虽然两者都是传址参数,但两者还是有区别的,用最简单的一句说来说:ref是能进能出,out是能出不能用。就是说ref是可以把值传入函数里,并且可以输出函数外,所以它主要用于函数内部需要对外部值进行修改的时候;out不能把值传入函数,只能做为输出,它主要用于函数需要返回多个值的时候。

要注意的有以下两点:

  1. 使用ref型参数时,在调用函数前必须初始化(设置过值);使用out型参数时,必须在函数内对其初始化(设值)。
  2. 使用refout时,函数的定义和调用函数时,参数前都要加refout关键字。

用一段简单的代码来说明,有一个整数数组,我们要计算它的和,平均数,以及个数,那么我可以写成这样:

C#
class Program
{
    static void Main(string[] args)
    {
        int sum;
        int avg;
        int count;

        int[] values1 = { 1, 2, 3 };
        testFunc(values1, out sum, out avg, out count);
        Console.WriteLine("数组有{2}个数,和为{0},平均值为{1}", sum, avg, count);
    }

    static void testFunc(int[] values, out int sum, out int avg, out int count)
    {
        count = values.Length;
        sum = 0;

        foreach(int value in values) {
            sum += value;
        }
        avg = sum / count;
    }
}

那么再加一点点功能,有两个整数数组,我们分别计算第一个数组的和,平均数,个数;以及这两个数组的和,平均数,个数。这时候我们就要用到ref了。代码如下:

C#
class Program
{
    static void Main(string[] args)
    {
        int sum = 0;
        int avg = 0;
        int count = 0;

        int[] values1 = { 1, 2, 3 };
        testFunc(values1, ref sum, ref avg, ref count);
        Console.WriteLine("第一个数组有{2}个数,和为{0},平均值为{1}", sum, avg, count);

        int[] values2 = { 9, 12, 15 };
        testFunc(values2, ref sum, ref avg, ref count);
        Console.WriteLine("两个数组有{2}个数,和为{0},平均值为{1}", sum, avg, count);
    }

    static void testFunc(int[] values, ref int sum, ref int avg, ref int count)
    {
        count += values.Length;
        foreach(int value in values) {
            sum += value;
        }
        avg = sum / count;
    }
}

转载请注明:宇托的狗窝 » C#函数参数中ref和out的使用方法与区别

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址