首页 > 代码库 > C#中对值类型和引用类型的一点认识

C#中对值类型和引用类型的一点认识

区别值类型和引用类型的重要一点就是值类型赋值的时候是给出一块内存空间,空间里放下要赋给值类型的值。而引用类型是开辟一块内存空间,空间里放下的是要赋给引用类型值的指向地址。

就像一个是复制了银行卡里的现金,你花了你复制的现金,和该银行卡是没有关系的。而引用类型是复制了一个银行卡,此卡为银行卡的副卡,因为他们的指向地址是一样的,所以当你使用副卡

的时候,主卡里的钱也会随之变动。

下面给出一段代码。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace WindowsConsoleApplicationValueAndReference{    class Program    {        static void Main(string[] args)        {            ReferenceAndValue.ReferenceAndValueMethod();                    }    }    public class Person    {        public string Name { get; set; }        public int Age { get; set; }    }    public static class ReferenceAndValue    {        public static void ReferenceAndValueMethod()        {            Person tang = new Person { Name = "Andelshejlsberge", Age = 25 };            int age = tang.Age;//age=tang.age=25            tang.Age = 22;            Person name = tang;//name.Name=andelshejlsberge            tang.Name = "tangxuelong";//tang.name=tangxuelong name.name=tang.name=tangxuelong            Console.WriteLine("tang.Name={0}",tang.Name);            Console.WriteLine("tang.age={0}", tang.Age);            Console.WriteLine("age={0}", age);            Console.WriteLine("name={0}", name.Name);            Console.ReadLine();        }    }}

分析一下代码。首先创建了一个person类,该类中包含name和age俩个属性

我们在方法中创建person的对象tang,初始化对象的name和age。

这时候看下一步,我们将对象tang的age赋值给一个int类型的变量age,然后改变对象tang的age的值,运行结果会告诉我们,此时age=25,tang.age=22;

接下来我们继续看下面的代码,继续创建一个对象将tang赋值给该对象。那么此时如果加入断点的话我们都知道name.Name=tang.Name=andershejlsberge这是没错的。那么接下来像上面一样我们改变tang.name的值我们会发现,name.name的值此时也改变了。

就像开始说的那样,引用类型不仅仅分配了内存空间,还解析了内存块的指向地址。

装箱和拆箱

装箱和拆箱其实就是引用类型和值类型之间的转换

值类型转换为引用类型就是装箱,引用类型转换为值类型就是拆箱。

public static class boxingAndUnboxing    {        public static void boxingandunboxing()        {            int ageInt = new int();            //boxing            object age =(object)ageInt;            age = null;            //unboxing            ageInt = (int)age;            Console.WriteLine(ageInt);        }    }

分析一下上面的代码。这段代码会抛出System.NullReferenceException异常,因为age为引用类型,引用类型是可以赋空值的,然后将引用类型转换为值类型时,引用类型没有值。。

所以就抛出了异常。而去掉这段代码输出结果为0,这是因为我们没有初始化,默认的值类型变量的值就为0