下面是c#常用的四种类型的参数,整理出来方便系统学习。
一、按值传递参数
值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递。
方法被调用时,CLR做如下操作:
1、在托管堆栈中为形参分配空间;
2、将实参的值复制到形参。
这个太常用了,按值传递参数,是复制一份,因此不影响原来参数的值。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
public static int Foo(int i,int j)
{
i++;
j++;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo(i, j);
Console.WriteLine(i);//1
Console.WriteLine(j);//2
Console.WriteLine(k);//5
}
}
二、按引用传递参数 ― 关键字ref
和前面的“按值传递”相对应的是按引用传递。顾名思义,这里传递的不在是值,而是引用。注意这里不是传递一个复制品了,而是将真实的自己传到方法中。
注意点:
1、按引用传递的参数,系统不再为形参在托管栈中分配新的内存。
2、此时,形参名其实已经成为实参名的一个别名,它们成对地指向相同的内存位置。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
public static int Foo(ref int i,ref int j)
{
i++;
j++;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo(ref i, ref j);
Console.WriteLine(i);//2
Console.WriteLine(j);//3
Console.WriteLine(k);//5
}
}
三、输出参数 ? 关键字out
输出参数和引用参数有一定程度的类似,输出参数可用于将值从方法内传递到方法外,实际上就相当于有多个返回值。要使用输出参数只需要将引用参数的ref关键字替换为out关键字即可。但又一点必须注意,只有变量才有资格作为输出参数,文本值和表达式都不可以,这点要谨记。
注意两个问题:
1、编译器允许在方法中的任意位置、任意时刻读取引用参数的值。
2、编译器禁止在为输出参数赋值前读取它。
这意味着输出参数的初始值基本上是没意义的,因为它在使用前要被赋予新的值。因此想通过输出参数将值传入方法的路是行不通的。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo( i, out j);
Console.WriteLine(i);//1
Console.WriteLine(j);//100
Console.WriteLine(k);//102
}
}
四、参数数组 ? 关键字params
参数数组:
public class Program
{
static void Main(string[] args)
{
int count1 = Plus(1); //输出 1
Console.WriteLine(count1);
int count2 = Plus(1, 2, 3);//输出 6
Console.WriteLine(count2);
int count3 = Plus(); //输出 0 参数数组本身可选,没传入值也不会出错
{
Console.WriteLine(count3);
}
Console.ReadKey();
}
public static int Plus(params int[] values)
{
int count = 0;
foreach (int i in values)
{
count = count + i;
}
return count;
}
}
另外再补充两个C# 4.0的新特性可选参数与命名参数:
1、可选参数
可选参数,顾名思义,它不是必需的。对于一般的参数,如果不为它指定值,可能会导出运行出错。但是可选参数不会。
可选参数的规则:
1、可选参数不能为参数列表第一个参数,它必须位于所有必选参数之后;
2、可选参数必须指定一个默认值;
3、可选参数的默认值必须是一个常量表达式;
4、所有可选参数以后的参数都必须是可选参数。
public class Program
{
static void Main(string[] args)
{
int count1 = Plus(5); //当不指定可选参数时,是默认值
Console.WriteLine(count1); //输出 15
int count2 = Plus(5,5); //当指定可选参数时,有默认值
Console.WriteLine(count2); //输出 10
Console.ReadKey();
}
public static int Plus(int i, int j = 10)
{
return i + j;
}
}
2、命名参数
可选参数解决的是参数默认值的问题,而命名参数解决的是参数顺序的问题,命名参数将我们从记忆每个方法数目繁多的参数列表中解放了出来。让你可以不按顺序输入参数。
public class Program
{
static void Main(string[] args)
{
//string str = "字符串";
//int i = 10;
//Console.WriteLine(Plus(str:str,i:i)); //虽然很怪异,但这3行代码是能正常运行的
Console.WriteLine(Plus(str:"字符串",i:10)); //注意顺序与方法签名参数中的不一样
Console.ReadKey();
}
public static string Plus(int i, string str)
{
return str + i.ToString();
}
}
模拟极限越野
模拟极限越野开着大巴在各种奇葩路况里送乘客。山路弯道多得让人
模拟火车
模拟火车让你当回真正的火车司机,得先学会看信号灯、操作控制杆
可口的披萨美味的披萨
可口的披萨美味的披萨带您体验经营一家披萨店的乐趣。游戏画风温
定制虚拟偶像最新版
定制虚拟偶像最新版是一款超级经典有趣的日本模拟装扮类型的手游
病娇模拟器手机版正版(yandere simulator)
病娇模拟器最新版手游是一款萌妹二次元模拟游戏,玩家在游戏中可