1. 一般值方式传入
先上代码:
using System;
namespace test
{
class Program
{
public static void PrintInfo(string name,int age, int score)
{
Console.WriteLine(@"姓名:{0}, 年龄:{1},成绩:{2}", name, age, score);
}
static void Main(string[] args)
{
string strName = @"张三";
int iAge = 12;
int iScore = 98;
PrintInfo(strName,12,98)
Console.ReadLine();
}
}
}
**特点:**事先定义变量,通过将变量传入到调用的方法名.
3. 键:值形式传入
先上代码:
using System;
namespace test
{
class Program
{
public static void PrintInfo(string name,int age, int score)
{
Console.WriteLine(@"姓名:{0}, 年龄:{1},成绩:{2}", name, age, score);
}
static void Main(string[] args)
{
// 输入参数顺序可以和方法的参数顺序不一致
PrintInfo(name:@"张三",age:12,score:98);
Console.ReadLine();
}
}
}
**特点:**不需要定义变量,但传入的key与方法的参数名一致,value与方法参数定义的类型一致,参数的顺序可以和方法的参数顺序不一致。
5. 函数中预设默认值
先上代码:
using System;
namespace test
{
class Program
{
public static void PrintInfo(string name,int age = 12, int score = 98)
{
Console.WriteLine(@"姓名:{0}, 年龄:{1},成绩:{2}", name, age, score);
}
static void Main(string[] args)
{
string strName = @"张三";
PrintInfo(strName);
PrintInfo(name:@"张三");
PrintInfo(name:@"张三",age:12,score:98);
Console.ReadKey();
}
}
}
**特点:**当传入的参数省略时,方法体使用默认参数值(注意:方法定义默认值的参数放在最后,多个默认值参数中间不能有非默认值的参数)
6. 不定个数的参数传入
先上代码:
using System;
namespace test
{
class Program
{
//不带固定参数的可变参数
public static void PrintInfo(params int[] list)
{
foreach (var item in list)
{
Console.WriteLine(item);
}
}
//带固定参数的可变参数
public static void PrintInfo(string name,params int[] list)
{
foreach (var item in list)
{
Console.WriteLine($"Name:{name}, 数值:{item}");
// 细看 $ @ ?? ? 的用法
}
}
static void Main(string[] args)
{
PrintInfo("幸运",1,2,3);
/* 输入:
* Name:幸运, 数值:1
* Name:幸运, 数值:2
* Name:幸运, 数值:3
*/
PrintInfo("幸运",new int[] {1,2,3,4});
/* 输入:
* Name:幸运, 数值:1
* Name:幸运, 数值:2
* Name:幸运, 数值:3
* Name:幸运, 数值:4
*/
Console.Read();
}
}
}
特点:
- 参数数组必须是一维数组。
- 不允许将params修饰符与ref和out修饰符组合起来使用, 且一个方法只允许有一个params修饰的参数,并且只能放在方法的最后一个参数 。
- 与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。
- 若实参是数组则按引用传递,若实参是变量或表达式则按值传递。
-
用法:可变的方法参数,也称数组型参数,适合于方法的参数个数不知的情况,用于传递大量的数组集合参数;当使用数组参数时,可通过使用params关键字在形参表中指定多种方法参数,并在方法的参数表中指定一个数组。
ref 关键字使参数按引用传递
using System;
namespace test
{
class Program
{
//不带固定参数的可变参数
internal static void Method(ref int i)
{
i = 44;
}
static void Main(string[] args)
{
int val = 0; // 必须先被始化
Method(ref val); // 必须显式使用 ref 关键字
console.WriteLine("val 的值是 " + val.toString());
// val is now 44
Console.Read();
}
}
}
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
out 关键字会导致参数通过引用来传递
using System;
namespace test
{
class Program
{
//不带固定参数的可变参数
internal static void Method(out int i)
{
i = 44;
}
static void Main(string[] args)
{
int val; // 必须先被始化
Method(out val); // 必须显式使用 out 关键字
console.WriteLine("val 的值是 " + val.toString());
// val is now 44
Console.Read();
}
}
}
out和ref之间的区别
- 首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
- 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。