Net复习笔记:第三章:参数传递
- 参数按照调用方式可以分为,形参和实参,形参就是被调用方法的参数,实参就是调用方法的参数
- Params可变参数,其实是一个特写,修饰的必须是一维数组,修饰的数组可以是任意类型,必须放在所以参数的最后面,只能使用一次
- 传递方式分为,值类型参数的按值传递,引用类型参数的按值传递,值类型参数的按引用传递,引用类型参数的按引用传递
- 值类型和引用类型在参数传递的时候传递的都是类型在堆栈上面的拷贝,只是值类型在堆栈上面的拷贝就是本身数据的拷贝,而引用类型在堆栈上面的拷贝是引用类型执行托管堆上面的地址,
- 不管是值类型还是引用类型,俺引用传递必须以ref或者out关键字来修饰
- Ref和out可以重载方法
按值传递和按址传递的本质区别
1. 按值传递:传递的是变量的一个副本。不管是值类型还是引用类型
2. 按引用传递:传递的是变量的内存地址。不管是值类型还是引用类型
3. public partial class hellowordle : System.Web.UI.Page
4. {
5. protected void Page_Load(object sender, EventArgs e)
6. {
7. List<prod> stin = new List<prod>();
8. stin.Add(new prod() { id = "1", name = "111" });
9. stin.Add(new prod() { id = "2", name = "111" });
10. stin.Add(new prod() { id = "3", name = "111" });
11. Myclo(stin);
12. }
13.
14. public void Myclo(List<prod> stin2)
15. {
16. List<prod> stin1 = new List<prod>();
17. stin1.Add(new prod() { id = "7", name = "111" });
18. stin1.Add(new prod() { id = "8", name = "111" });
19. stin 2= stin2.Concat(stin1).ToList();
20. }
21. }
22. public class prod
23. {
24. public string id { get; set; }
25. public string name { get; set; }
26. }
上面代码中虽然stin在传入Myclo中做了改变,但是stin的值是不会变的
原因是:Myclo(stin);传递给Myclo(List<prod> stin2)的是一个stin的地址的拷贝
在Myclo中对stin2的操作是对拷贝地址指向内容的操作,当对stin2改变指向的时候修改的是拷贝的地址的指向,对原来的stin是没有关系,但是如果不修改stin2的指向而是对其进行增加修改就会影响到stin,因为这个时候她们的指向是相同的,这就是按值传递
- 值类型的按值传递和按引用传递区别很大,值类型的按值传递,传递的是实例的本身,而按引用传递,传递的是实例的引用,
- 引用类型的按值传递和按引用传递区别是,引用类型按值传递传递的是引用的拷贝,而按引用传递,传递的是本身的引用(但是传递的都是引用,区别就是一个是拷贝的引用一个是本身的引用)