四、C#中的方法
5、方法的参数拓展
1)实参和形参
方法中的参数分为实际参数和形式参数,实际参数被称为实参,是在调用方法时传递的参
数;形式参数被称为形参,是在方法定义中所写的参数。
例如以下代码:
其中对于Add方法来说,
变量num1和num2是实际参数,称为实参。
a和b是形式参数,称为形参。
static void Mian(string[] args)
{
//创建一个对象
Program program = new Program();
//创建两个变量
int num1 = 5;
int num2 = 6;
//调用Add方法
program.Add(num1,num2);
}
/// <summary>
/// 两个整数相加
/// </summary>
/// <param name="a">第一个整数</param>
/// <param name="b">第二个整数</param>
/// <returns></returns>
public int Add(int a, int b)
{
return a + b;
}
2)值传递和引用传递
C#中参数传递的方式有两种:值传递和引用传递
值传递:值传递是指在调用方法时将实际参数复制一份传递到方法中,这样在方法中如果对参数进行
修改,将不会影响到实际参数。
对于值类型的数据,如果没有特殊说明,那么在方法调用时按照值传递的方式进行参数的传
递。
引用传递:
引用传递是指在调用方法时实际参数和形式参数都指向同一个内存,这样在方法中如果对参
数进行修改,将会影响到实际参数。
前面我们讲到C#数据类型分为值类型和引用类型。
那么在方法调用时,值类型一般都是以值传递的方式,引用类型都是以引用传递的方式。
例如以下代码:
//IntValue.cs 源文件
/// <summary>
/// 定义一个只包含整数的类型
/// </summary>
class IntValue
{
public int Value { get; set; }
}
//Program.cs 源文件
static void Main(string[] args)
{
int num = 5;
IntValue intValue = new IntValue();
intValue.Value = 5;
Console.WriteLine("num:{0}", num);
//值类型
ChangeValue(num);
Console.WriteLine("num:{0}", num);
Console.WriteLine("IntValue:{0}", intValue.Value);
//引用数据类型
ChangeValue(intValue);
Console.WriteLine("IntValue:{0}", intValue.Value);
}
static void ChangeValue(int value)
{
value = 20;
}
static void ChangeValue(IntValue intValue)
{
intValue.Value = 20;
}
3)ref关键字和out关键字
ref:当方法定义的时候在形参前面添加ref关键字表明是以引用的方式进行传参。(参数传递
时也需要添加ref关键字)
使用场景:需要以引用的方式传递值类型参数。
修改上一个案例的ChangeValue方法:
运行后可以看到,对于值类型,在参数列表添加ref关键字之后,达到了引用传递参数的效
果,在方法内部对形参的变动可以影响到实参。
//IntValue.cs 源文件
/// <summary>
/// 定义一个只包含整数的类型
/// </summary>
class IntValue
{
public int Value { get; set; }
}
//Program.cs 源文件
static void Main(string[] args)
{
int num = 5;
IntValue intValue = new IntValue();
intValue.Value = 5;
Console.WriteLine("num:{0}", num);
//值类型
ChangeValue(ref num);
Console.WriteLine("num:{0}", num);
Console.WriteLine("IntValue:{0}", intValue.Value);
//引用数据类型
ChangeValue(intValue);
Console.WriteLine("IntValue:{0}", intValue.Value);
}
static void ChangeValue(ref int value)
{
value = 20;
}
static void ChangeValue(IntValue intValue)
{
intValue.Value = 20;
}
拓展:
引用类型使用ref传参和不适用ref传参需要注意的地方:
a. 当引用类型不使用ref传参,在方法内部重新new一个对象后再进行操作,则该操作对实
参没有影响。
b. 当引用类型使用ref传参,在方法内部重新new一个对象后再进行操作,则相当于将实参
指向一个新的对象。
out:out关键字修饰的参数为输出参数。(参数传递时也需要添加out关键字)
使用场景:需要有多个返回值的情况。
例如以下代码:
/// <summary>
/// 这个是主函数,是程序的入口
/// </summary>
/// <param name="args">参数说明</param>
static void Main(string[] args)
{
int num1 = 5;
int num2 = 0;
int result;
//out关键字与实参一同传入
bool isSuccessed = Divided(num1, num2,out result);
Console.WriteLine("isSuccessed:{0},Result:{1} ", isSuccessed, result);
}
/// <summary>
/// 两个整数相除
/// </summary>
/// <param name="value1">值1</param>
/// <param name="value2">值2</param>
/// <param name="result">结果</param>
/// <returns>是否成功</returns>
static bool Divided(int value1, int value2,out int result)
{
result = 0;
if (value2 == 0)
{
return false;
}
result = value1 / value2;
return true;
}
6、方法的默认参数
C#中允许给方法设置默认参数,当调用方法时如果没有传递相应的实参,那么系统就是使
用默认参数替代。方法的默认参数只能设置在非默认参数的后面。且默认参数可以多个。
举例如下:
static void Main(string[] args)
{
int num = 5;
Console.WriteLine("初始值:{0}", num);
ChangeValue(ref num);
Console.WriteLine("修改之后的值(默认修改):{0}", num);
ChangeValue(ref num, 10);
Console.WriteLine("修改之后的值(加10):{0}", num);
}
/// <summary>
/// 带有默认参数的方法
/// </summary>
/// <param name="number">要修改的值</param>
/// <param name="value">修改因子,默认为5</param>
public static void ChangeValue(ref Int32 number ,int value = 5)
{
number = number + value;
}