一、值类型和引用类型数据的传递
引用类型:string 、数组、集合、object类型、自定义类、接口、
值类型:int 、double、char、bool、enum、struct、decimal
1、值类型数据在复制的时候,传递的是值的本身
2、引用类型数据在复制的时候,传递的是这个值的引用(即地址)1、值类型数据的传递:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 值类型的传递1 { class Program { static void Main(string[] args) { int num1 = 20; int num2 = num1; num2 = 40; Console.WriteLine("num1的值是: "+num1); Console.WriteLine("num2的值是: "+num2); Console.ReadKey(); } } }
运行结果:
内存分析图:
2、引用类型数据的传递1:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 引用类型的传递1 { class Program { static void Main(string[] args) { Person per1 = new Person(); per1.Name = "张三"; Person per2 = per1; per2.Name = "李四"; Console.WriteLine("per1.name的值是: " +per1.Name); Console.WriteLine("per2.name的值是: " +per2.Name); Console.ReadKey(); } } public class Person { public string _name; public string Name { get { return _name; } set { _name = value; } } } }
运行结果:
内存分析:
调试分析:
引用类型的传递2:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 引用数据类型的传递2 { class Program { static void Main(string[] args) { Person per = new Person(); per.Name = "张三"; Test(per); Console.WriteLine("per.name的值为: " +per.Name); Console.ReadKey(); } public static void Test(Person p) { Person pp = p; pp.Name = "李四"; } } public class Person { public string _name; public string Name { get { return _name; } set { _name = value; } } } }
运行结果:
内存分析:
3、引用类型的传递字符串的特例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 引用的传递 { class Program { static void Main(string[] args) { string str = "张三"; string str1 = str; Console.WriteLine("str的值为: " + str); Console.WriteLine("str1的值为: "+ str1); Console.WriteLine("======分割线======"); str1 = "李四"; Console.WriteLine("str的值为: "+ str); Console.WriteLine("str1的值为: "+ str1); Console.WriteLine("======分割线======"); str1 = str; Console.WriteLine("str的值为: "+ str); Console.WriteLine("str1的值为:"+ str1); Console.WriteLine("======分割线======"); Console.ReadKey(); } } }
运行结果:
调试分析:
引用的传递与ref参数的区别:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ref的传递原理 { class Program { static void Main(string[] args) { int num = 10; int rnum = 10; Test(num); Rtest(ref rnum); Console.WriteLine("调用没有使用ref参数的方法后的值为: "+ num); Console.WriteLine("调用使用ref参数的方法后的值为: " + rnum); Console.ReadKey(); } public static void Test(int n) { n += 10; } public static void Rtest(ref int rn) { rn += 10; } } }
运行结果:
调试分析图:
内存分析图: