1 关于重载
原则:有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载
2 关于调用前初始值
原则:ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将提示:使用了未赋值的局部变量;
out作为参数的函数在调用前,实参可以不赋初始值。
3 关于在函数内,引入的参数初始值问题
原则:在被调用函数内,out引入的参数在返回前至少赋值一次,否则编译器将提示:使用了未赋值的out参数;
在被调用函数内,ref引入的参数在返回前不必为其赋初值。
但也不是说,引用类型就一定不会用到ref关键字,当我们试图将引用类型的重新赋值时
public void Changeref(RefClass rc)
{rc = new RefClass() { IntValue = 1000 };}
如果不加ref ,prc实际上是在函数内部将引用的地址,指向了另一new RefClass(),返回值会发现它的值未发生改变
public static void A() {
List<string> strList=new List<string>();
strList.Add("111");
B(ref strList)
}
public static void B(ref List<string> strlist)
{
strlist.Add("123");
}
在B方法中strList包含111数据了,再调用完B方法后返回的strList中就已经包含111和123这两个数据了
public static void A() {
List<string> strList=new List<string>();
strList.Add("111");
B(out strList)
}
public static void B(out List<string> strlist)
{
strlist=new List<string>();
strlist.Add("123");
}
在B方法中需要重新给list<string>赋值才行,然后执行完B方法后strList中只有123数据,把方法里面的out直接改成ref其实结果都是一样的。
out方法不需要给初始值,因为在方法里面需要重新赋值,ref必须给初始值,方法里面是在初始值的基础上进行处理