1,下面解释属于个人通俗理解版:
值类型:复制的过程只是复制副本,后面改变副本的值,不会对初始值产生影响。
引用类型:这里主要用类变量阐述,如果class var1=new class();和class var2=var1;都是引用的同一类对象var1,那么var2的值改变,var1也会改变。,
2,当值类型中包含引用类型时,依然存在值类型和引用类型的区分。
class ShapeInfo //创建一个引用(类)类型 { public string infoString; public ShapeInfo(string info)//带参数的构造函数 { infoString = info; } } struct MyRectangle //创建一个值类型(结构类型) { public ShapeInfo rectInfo; public int top, left, right, bottom; public MyRectangle(string info) { rectInfo = new ShapeInfo(info);//实例化类类型 top = left = 11; bottom = right = 110; } } class Program { static void Main(string[] args) { Console.WriteLine("创建第一个MyRectangle变量 r1"); MyRectangle r1 = new MyRectangle("这是我创建的第一个MyRectangle对象"); Console.WriteLine("现在将一个新的MyRectangle赋值给r1"); MyRectangle r2 = r1; Console.WriteLine("改变r2的值"); r2.rectInfo.infoString = "这是一个新的字符串信息";//改变类对象中的信息字符串值 r2.bottom = 120;//改变结构类型中的bottom值 Console.WriteLine("改变后的新值:"); Console.WriteLine("->r1.rectInfo.infoString:{0}", r1.rectInfo.infoString); Console.WriteLine("->r2.rectInfo.infoString:{0}", r2.rectInfo.infoString); Console.WriteLine("->r1.botton:{0}", r1.bottom); Console.WriteLine("->r2.botton:{0}", r2.bottom); Console.ReadKey(); } }
3.按值类型传递引用类型。
class MyInfo { public string MyName;//定义一个字符串类型变量存储用户姓名 public int MyAge;//定义一个整数类型变量存储用户年龄 public MyInfo(string name, int age)//创建一个带参数的构造函数 { MyName = name; MyAge = age; } public MyInfo() { }//默认构造函数 public void PrintInfo()//创建一个公有方法输出用户年龄信息 { Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge); } } class Program { public static void SendAPersonByValue(MyInfo info) { info.MyAge = 99;//改变‘info’的年龄 info = new MyInfo("顾丽丽", 99);//这里info是不能被重新创建的,因为这个对象已经存在。 } static void Main(string[] args) {//按值传递引用类型 Console.WriteLine("输出用户年龄信息:"); MyInfo fred = new MyInfo("房大伟", 29); Console.WriteLine("未改变用户信息前"); fred.PrintInfo(); SendAPersonByValue(fred); Console.WriteLine("改变后的用户年龄信息:"); fred.PrintInfo(); Console.ReadKey(); } }
4,按引用传递引用类型。
class MyInfo { public string MyName;//定义一个字符串类型变量存储用户姓名 public int MyAge;//定义一个整数类型变量存储用户年龄 public MyInfo(string name, int age)//创建一个带参数的构造函数 { MyName = name; MyAge = age; } public MyInfo() { }//默认构造函数 public void PrintInfo()//创建一个公有方法输出用户年龄信息 { Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge); } } class Program { public static void SendAPersonByValue(ref MyInfo info) { info.MyAge = 99;//改变'info'的值 info = new MyInfo("顾丽丽", 25);//”info”现在指向了堆上的一个新对象,被改变。 } static void Main(string[] args) { Console.WriteLine("输出用户年龄信息:"); MyInfo fred = new MyInfo("房大伟", 29); Console.WriteLine("未改变用户信息前"); fred.PrintInfo(); SendAPersonByValue(ref fred); Console.WriteLine("改变后的用户年龄信息:"); fred.PrintInfo(); Console.ReadKey(); } }