傻瓜教你学习值参数,引用参数(ref)以及输出参数(out)
我们已经知道了值类型和引用类型,但是一定要区别"值类型和值参数","引用类型和引用参数",这一点是最容易让初学者搞晕的,说白了,所谓"类型",就是一种相似或相同的东西的抽象,它表示了一种相类似,例如,把东西分"类",此时这个类就是我们说的类型,而值参数和引用参数呢?无论这两个中的哪个,都离不开"参数"二字,什么是参数?或者说参数是在什么里面的?答案当然是方法里面,离开了"方法()"的这对"小括号()"就无从谈起参数,说到这我们就知道了,参数肯定是在'()'里面了,例如,
static void Main(string[] args)
{
string strName = "李杰";
Insert(strName);//strName就是实参
}
//str就是形参
static void Insert(string str)
{
Console.WriteLine(str);
}
他们两个都是参数,区别就是形参和实参的区别,具体区别这里我就不讲了,如果有不了解的可以mail给我,说到这里,我想你肯定也知道了"值参数和引用参数"肯定都是参数,但是他们的区别到底在哪里呢?
"值参数"就想我上面所写的,就是我们平时用的普普通通的参数而已,我们知道,值参数的传递,只是将变量中的值"复制"了一份给形参而已,所以如果这个参数只是一个'值类型'的参数的话,那形参中就是变量的值的副本而已,此时形参实参都是保存在线程栈中,形参一旦有了值就和实参再无任何关系了(可以说此时的形参过河拆桥了),改变任何一个对另一个都不会有任何的影响,而如果参数是一个'引用类型'的参数,那么形参中保存的就是"引用"副本,此时形参也是指向托管堆中的对象的,此时如果你使用形参或者实参中的任何一个改变对象的数据,再用另一个访问对象的数据都是受到影响的,因为他们指向的都是同一个东西.
啰嗦了这么多"值参数",你肯定想不耐烦的问,那"引用参数"到底是什么样的呢?其实很简单只需加上一个"ref"就变成了引用参数,此时方法的调用就不能是上面那个样子了,应该是
string strName = "李杰";
Insert(ref strName);//strName就是实参
同时
//str就是形参
static void Insert(ref string str)
{
Console.WriteLine(str);
}
当变成了引用参数时就不再是像'值参数'那样,形参只是实参的副本而已,此时的形参就是实参,他们两个是完全一样的,就好像起了"乳名"一样,相信我们大部分人都有乳名的,比如,大名叫"李四",乳名叫"二狗子",只是不同的名字,可能喊的场所不一样,但是他们确实是同一个人,这就好比引用参数的形参和实参一样,他们也是一样的,此时你无论改变谁,改变的其实都是同一个数据而已
但是他们也有个最大的共同点:就是必须使用前都要给初始值.
除了值参数,引用参数,还有一个就是输出参数(out),它和引用参数类似,只不过使用out,但是还有一点最最重要的不同:所谓"输出",顾名思义就是从内往外,这就形成了输出参数的赋值形式--是从方法内部往外给变量赋值,
还是上面的例子,
static void Main(string[] args)
{
string strName;
Insert(out strName);//strName就是实参
Console.WriteLine(strName);
}
同时
//str就是形参
static void Insert(out string str)
{
str = "李杰";
}
此时就是赋值顺序就是str->strName,先在Insert中在托管堆中给"引用类型"的字符串分配一块内存空间,然后str指向这块内存,最后将这个str中的地址再赋给strName,使strName也指向这块内存,就是这么简单.很简单吧,如果我哪里不正确的,麻烦园友Mail指出,谢谢