C#中ref、out、params关键字的介绍和基础用法
程序员文章站
2022-04-30 13:37:47
...
一、介绍
1.1、相同点:ref与out关键字都是按地址传递,使用后都将改变原来参数的数值。
1.2、不同点:
①ref关键字,使用引用类型参数,在方法中对参数所做的任何更改都将反应在该变量中(也就是说:ref可以将参数传递到函数中;但是需要在函数外面初始化传入的ref参数)
②out关键字,会导致参数通过引用来传递,无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以需要在函数里面初始化out参数。
③params关键字,用于方法参数长度不定的情况。有时候不能确定一个方法的方法参数到底有多少个,可以使用params关键字来解决问题。
1.3、参考示例:
①ref关键字示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test_RefAndOut
{
class Program
{
static void Main(string[] args)
{
int testNumber = 6;
Console.WriteLine("初始值为:" + testNumber);
//1-调用Ref参数的方法
RefMethod(ref testNumber);
Console.WriteLine("3-经过Ref参数方法处理的值为:"+testNumber);
Console.ReadLine();
}
/// <summary>
/// Ref参数的方法
/// </summary>
/// <param name="curNumber">输入的ref参数(需要在函数外部先初始化)</param>
private static void RefMethod(ref int curNumber)
{
Console.WriteLine("1-Ref参数方法当前初始输入的参数为:"+curNumber);
if (curNumber >= 0)
{
curNumber *= 1024;
}
else
{
curNumber = -1;
}
Console.WriteLine("2-Ref参数方法当前处理得到输入的参数为:" + curNumber);
}
}//Class_end
}
ref关键字输出结果:
②out关键字示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test_RefAndOut
{
class Program
{
static void Main(string[] args)
{
int testNumber = 6;
Console.WriteLine("初始值为:" + testNumber);
//2-调用Out参数的方法
OutMethod(out testNumber);
Console.WriteLine("3-经过Out参数方法处理的值为:" + testNumber);
Console.ReadLine();
}
/// <summary>
/// Out参数方法
/// </summary>
/// <param name="curNumber">输入的Out参数(需要在函数内部初始化)</param>
private static void OutMethod(out int curNumber)
{
////报错
//Console.WriteLine("1-Out参数方法当前初始输入的参数为:" + curNumber);
//先赋值初始化
curNumber = 1;
Console.WriteLine("1-Out参数方法当前初始输入的参数为:" + curNumber);
if (curNumber >= 0)
{
curNumber *= 1024;
}
else
{
curNumber = -1;
}
Console.WriteLine("2-Out参数方法当前处理得到输入的参数为:" + curNumber);
}
}//Class_end
}
out关键字输出结果
③ref与out关键字结合使用示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test_RefAndOut
{
class Program
{
static void Main(string[] args)
{
int testNumber1, testNumber2;
testNumber1 = 6;
testNumber2 = 3;
Console.WriteLine("初始值的ref参数1为:" + testNumber1 + " 初始值的out参数2为:" + testNumber2);
// Ref参数与Out参数方法
RefAndOutMethod(ref testNumber1, out testNumber2);
Console.WriteLine("3-经过 RefAndOut参数方法处的ref参数1为:" + testNumber1 + " 经过RefAndOut初始值的out参数2为:" + testNumber2);
Console.ReadLine();
}
/// <summary>
/// Ref参数与Out参数方法
/// </summary>
/// <param name="curNumber1">ref 参数</param>
/// <param name="curNumber2">out 参数</param>
private static void RefAndOutMethod(ref int curNumber1,out int curNumber2)
{
//out参数需要在函数内初始化
curNumber2 = 1024;
Console.WriteLine("1-RefAndOut参数方法----当前初始输入的ref参数1为:" + curNumber1+ " 当前初始输入的out参数2为:"+ curNumber2);
if (curNumber1 >= 0)
{
curNumber2 *= curNumber1;
}
else
{
curNumber2 = 0;
}
Console.WriteLine("2-RefAndOut参数方法----当前处理得到的ref参数1为:" + curNumber1 + " 当前处理得到的out参数2为:" + curNumber2);
}
/// <summary>
}//Class_end
}
ref和out关键字输出结果
④param关键字示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test_RefAndOut
{
class Program
{
static void Main(string[] args)
{
int[] testNumber1 = { 1, 8, 3 };
int[] testNumber2 = { 6, 11, 7,9,8,6,54 };
//Params参数方法
ParamsMethod(testNumber1);
Console.WriteLine("----------------------\n");
ParamsMethod(testNumber2);
Console.ReadLine();
}
/// <summary>
/// Params参数方法
/// </summary>
/// <param name="curNumbers">不定长度的参数</param>
private static void ParamsMethod(params int[] curNumbers)
{
int len = curNumbers.Length;
for (int i = 0; i < len; i++)
{
Console.WriteLine("Params参数方法:"+curNumbers[i]);
}
}
}//Class_end
}
params关键字输出结果