参数传递根据参数类型分为按值传递和按引用传递,默认情况下都是按值传递的,如果希望按引用传递可以在参数前加ref或者out,今天我们主要说一个按传递中的
值传递和引用类型参数的按值传递。
值类型实例传递的是该值类型实例的一个拷贝,因此被调用方法操作的是属于自己本身的实例拷贝,因此不影响原来调用方法中的实例值。
引用类型传递的是对象的引用地址,在方法内操作对象时,原对象实例也会发生改变(其实方法内与方法外是同一对象)。
具体看代码:
class Order
{
public Order()
{
this.User = new User { UserID = -1, UserName = "匿名" };
}
public int price = 10;
public List<OrderDetail> OrderDetail { get; set; }
public User User { get; set; }
}
class User
{
public int UserID { get; set; }
public string UserName { get; set; }
}
class OrderDetail
{
public int ProductID { get; set; }
public string Name { get; set; }
public decimal Cost { get; set; }
}
/// <summary>
/// 引用类型作为参数,传递的是地址,会影响原值
/// </summary>
/// <param name="abf"></param>
private static void RefRef(Order abf)
{
abf.price = 20;
Console.WriteLine(abf.price);
}
/// <summary>
/// string类型作为参数,不会影响原值
/// </summary>
/// <param name="aStr"></param>
static void RefStr(string aStr)
{
aStr = "Changing String";
Console.WriteLine(aStr);
}
/// <summary>
/// 引用类型中的引用类型作为参数,传递的是地址,会影响原值
/// </summary>
/// <param name="order"></param>
static void RefInRef(Order order)
{
order.User.UserName = "zzl";
Console.WriteLine(order.User.UserName);
}
/// <summary>
/// 值类型作为参数,不会影响原值
/// </summary>
/// <param name="i"></param>
private static void RefValue(int i)
{
i = i + 10;
Console.WriteLine(i);
}
//引用类型作为参数传递
Order abf = new Order();
RefRef(abf);
Console.WriteLine(abf.price);
//(string)引用类型作为参数传递
string str = "Old String";
RefStr(str);
Console.WriteLine(str);
//引用类型中的引用类型
Order order = new Order();
RefInRef(order);
Console.WriteLine(order.User.UserName);
//值类型作为参数传递
int a = 10;
RefValue(a);
Console.WriteLine(a);
结果: