page contents

C#中out参数、ref参数与值参数的用法及区别

本文讲述了C#中out参数、ref参数与值参数的用法及区别!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-05-ONe8c4IN628ee75c102c6.png

本文讲述了C#中out参数、ref参数与值参数的用法及区别!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

C#方法中参数类型:有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结

大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别?

本文想介绍下详细介绍下out参数,ref参数以及一般值参数。

值参数

在使用参数时,把一个值传递给函数使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。如下面的函数,是使函数是使传递过来的参数值加倍,并显示出来:

1
2
3
4
5
static void ShowDouble(int num)
{
 num = num * 2;
 Console.WriteLine("num*2={0}", num);
}

参数num在函数中被加倍,如果按以下方式调用它:

1
2
3
4
int num = 5;
Console.WriteLine("num={0}", num);
ShowDouble(num);
Console.WriteLine("num={0}", num);

输出到控制台的文本如下所示:

把num作为参数,调用ShowDouble()并不影响Mian()中num的值,即使把num值加倍之后再赋值给num,在函数调用完之后num的值还是不会变。

这也没什么问题。

但是如果我们想改变num的值呢?我们会想到使用为num返回新值的函数:

1
2
3
4
5
static int DoubleNum(int num)
{
 num = num * 2;
 return num;
}

然后调用:

1
2
3
4
int num = 5;
Console.WriteLine("num={0}", num);
num = DoubleNum(num);
Console.WriteLine("num={0}", num);

这段代码不是很直观,且不能改变用作参数的多个变量值(因为函数只有一个返回值)。这个时候我们可以想到引用参数,即函数处理的变量和函数调用的变量相同,而不仅仅是值相同的变量。因此对这个变量的任何改变都会影响用作参数的变量值。为此,我们使用ref关键词指定参数。

ref参数

1
2
3
4
int num = 5;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);

运行控制台结果如下:

用作ref的参数的变量有两个限制:

1.函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量,所以下面的代码是不被允许的:

1
2
3
4
const int num = 5;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);

2.必须使用初始化过的变量。C#不允许假定ref参数在函数调用时初始化,下面的代码也是不被允许的:

1
2
3
4
int num;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);

输出参数(out)

除了ref外,还可以指定out关键字,指定所给的参数时一个输出参数,out参数和ref参数都在函数定义和函数调用中作为参数的修饰符。事实上,它的执行方式与ref参数几乎完全一样,因为在函数执行完毕后,该参数的值将返回给函数调用中使用的变量。但是,二者存在一些重要区别:

1.把未赋值的变量用作ref参数是非法的,但是未赋值的变量可以用作out参数

2.在函数中使用out参数时,必须将其看成尚未赋值。也就是说调用代码可以把已赋值的变量用作out参数,但在函数执行时该变量的值会丢失。

如现在有一个返回数组中最大值得Max()函数,获取数组中最大值得元素索引(这里假设如果有多个最大值,只返回第一个最大值索引),添加out参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int Max(int[] intArray,out int maxIndex)
  {
   int maxVal = intArray[0];
   maxIndex = 0;
   for (int i = 1; i < intArray.Length; i++)
   {
    if(intArray[i]>maxVal)
    {
     maxVal = intArray[i];
     maxIndex = i;
    }
   }
   return maxVal;
  }

调用上面的代码:

1
2
3
4
int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
int maxIndex;
Console.WriteLine("the maxium value is {0}", Max(myArray, out maxIndex));
Console.WriteLine("the index of the maxium value is{0}", maxIndex + 1);

控制台输出的结果如下所示:

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-yeIctC42628ee71392575.jpg

  • 发表于 2022-05-26 10:35
  • 阅读 ( 474 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章