引用类型和值类型传入函数的区别
2015-01-13 11:40
274 查看
引用类型和值类型
背景:当一个变量以参数形式传入函数的时候,在函数进行操作后。该值改变了吗?
基础:引用类型和值类型;作用域;静态函数;
答案及原理:
当参数为值类型的时候,传入函数的是值而不是地址。该函数会自己创建一份内存来存储这份值。所以无论函数内如何操作,函数外的值是永远不会变的。
当参数为引用类型的时候,传入函数的是地址。该函数内所有操作都是对地址所指向的内存单元进行才做。SO,函数内的操作会影响函数外的一切。
代码演示:
运行结果:
背景:当一个变量以参数形式传入函数的时候,在函数进行操作后。该值改变了吗?
基础:引用类型和值类型;作用域;静态函数;
答案及原理:
当参数为值类型的时候,传入函数的是值而不是地址。该函数会自己创建一份内存来存储这份值。所以无论函数内如何操作,函数外的值是永远不会变的。
当参数为引用类型的时候,传入函数的是地址。该函数内所有操作都是对地址所指向的内存单元进行才做。SO,函数内的操作会影响函数外的一切。
代码演示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RefValTest { //班级 public class Class { //班级名称 public string className { get; set; } //班级编号 public string classCode { get; set; } public Class(string className ,string classCode){ this.classCode = classCode; this.className = className; } } class Program { public static Class staticClass = new Class("源动力_Static", "007_Static"); public static Class staticClass1 = new Class("源动力_Static", "007_Static"); /// <summary> /// 测试引用类型和值类型 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //值类型 int i = 0; //引用类型 Class yuanDongLi = new Class("源动力_Common", "007_Common"); Class yuanDongLi1 = new Class("源动力_Common", "007_Common"); //普通调用 ChangeVlaue(i, yuanDongLi, staticClass); Console.WriteLine("i:" + i + " yuanDongLi:" + yuanDongLi.className + " staticClass:" + staticClass.className); //ref out 引用 int j; ChangeVlaue(ref i,out j, ref yuanDongLi1, out staticClass1); Console.WriteLine("i:" + i + " yuanDongLi:" + yuanDongLi.className + " staticClass:" + staticClass.className+" j:"+j); } /// <summary> /// 普通方法 /// </summary> /// <param name="i"></param> /// <param name="yuanDongLi"></param> /// <returns></returns> public static void ChangeVlaue(int i, Class yuanDongLi, Class staticClass) { i = i + 1; yuanDongLi.classCode += "_Change"; yuanDongLi.className += "_Change"; staticClass.classCode += "_Change"; staticClass.className += "_Change"; } /// <summary> /// ref out 引静态变量 /// </summary> /// <param name="i"></param> /// <param name="yuanDongLi"></param> /// <returns></returns> public static void ChangeVlaue(ref int i,out int j, ref Class yuanDongLi, out Class tempClass) { j = i; i = i + 1; j = j + 1; yuanDongLi.classCode += "_Change"; yuanDongLi.className += "_Change"; tempClass = staticClass1; tempClass.classCode += "_Change"; tempClass.className += "_Change"; } } }
运行结果:
相关文章推荐
- 实际举例C#引用类型和值类型的区别
- C#引用类型和值类型的区别
- 函数返回值为自定义的类型与引用类型的区别
- 当函数传入参数是引用类型的几种情况和现象。
- Go内建函数(对于引用类型) new 和 make 的区别
- 实际举例C#引用类型和值类型的区别(转)
- 实际举例C#引用类型和值类型的区别study(转)
- Java函数传递引用和值的区别
- 函数的返回值的类型是引用类型和非引用类型的区别
- C#引用类型和值类型的区别
- C#引用类型和值类型的区别
- C#引用类型和值类型的区别——值类型和引用类型在内存中的部署
- C#引用类型和值类型的区别——值类型和引用类型在内存中的部署
- c#中引用类型和值类型的区别
- [VB.NET]引用和值类型的区别? 分不清了,麻烦大家看看我的代码.
- C#引用类型和值类型的区别
- C# 引用类型和值类型的区别
- C#引用类型和值类型的区别(转)
- C#中引用类型和值类型的区别,分别有哪些
- C#引用类型和值类型的区别