今天来写一个交换值的方法函数
//未使用ref参数
static void Main(string[] args)
{
int a = 10, b = 5;
Console.WriteLine("调用方法前:a={0},b={1}", a, b);
TextRef(a, b);
Console.WriteLine("调用方法后:a={0},b={1}", a, b);
Console.ReadKey();
}
public static void TextRef(int r1, int r2)
{
int temp = r1;
r1 = r2;
r2 = temp;
}
????what????为什么没有交换呐???
这就需要学习到高级参数ref,全称: reference
原因分析:代码中int是值类型,所创建的实例不在托管堆中分配内存地址,我们通过方法函数只不过是将数据复制过来,在方法调用结束后并不会对Mian中的数据进行任何修改。
使用ref试试:
//使用ref参数
static void Main(string[] args)
{
int a = 10, b = 5;//对参数进行赋值
Console.WriteLine("调用方法前:a={0},b={1}", a, b);
TextRef(ref a,ref b);//调用方法时在参数前加ref
Console.WriteLine("调用方法后:a={0},b={1}", a, b);
Console.ReadKey();
}
public static void TextRef(ref int r1, ref int r2)//传入参数前要给参数赋值 ★和out参数进行对比★
{
int temp = r1;
r1 = r2;
r2 = temp;
}
效果实现,能够达到我们想要的交换值得目的。
原因分析:ref参数修饰变量的传递方式是引用传递,是对参数的地址进行改变,就像C中的指针一样,直接能够对原数进行操作,而不是对原数的那个Copy值进行操作。
一句话总结:在方法中对参数所做的任何更改都将反映到该变量上。
拓展:
实参和形参对应ref这么麻烦为什么我们要一一对应?尝试实参或者形参中不写ref参数结果又会如何?程序会出现异常还是能够正常编译?调用方法前为对参数赋值又会出现什么问题?
拓展①:形参中不使用ref参数
实参中不使用ref参数
拓展②:调用方法前未对参数赋值
总结:
- 调用方法时必须加ref关键字(参考拓展①)
- 传入参数前必修给参数赋值(参考拓展②)
每天进步一点点,奥利给。