值类型与引用类型

Posted david96007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值类型与引用类型相关的知识,希望对你有一定的参考价值。

在C#中,所有类型都可划分为值类型和引用类型。值类型包括简单类型、结构体类型和枚举类型;引用类型包括自定义类、数组、接口、委托等。

值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。

从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低。

下面通过简单示例来演示值类型与引用类型的区别。

01 class MyInt                                    //类是引用类型

02 {

03 public int I;

04 }

05 static void Main(string[] args)

06 {

07 int num1 = 123;                            //简单数据类型为值类型

08 int num2 = num1;                        //将值复制给新变量

09 num1 = 345;                            //修改num1的值并不影响num2的值

10 Console.WriteLine("num1={0,-10}num2={1}", num1, num2);

11 MyInt i1 = new MyInt();                    //类类型为引用类型

12 i1.I = 123;

13 MyInt i2 = i1;                            //进行引用复制

14 i1.I = 345;                                //修改i1的值,将影响i2的值。

15 Console.WriteLine("i1.I={0,-10}i2.I={1}", i1.I, i2.I);

16 }

简单数据类型为值类型,这里用int类型为例,创建两个变量:num1和num2,其中num2的值是通过复制num1的值得到的,之后修改num1的值,因为值类型的变量分别进行存储,改变一个变量的值,并不会影响另一个变量的值,所以修改num1的值并不影响num2的值。

类类型为引用类型,这里创建了一个简单的自定义类MyInt(本书尚未涉及到面向对象的知识,如果您对类尚不熟悉,需要查阅相关资料进行学习),只包含一个简单的数据成员I。同样定义两个变量,i1和i2,i2是通过复制i1的引用完成的赋值,i1和i2占用同一块内存,任何一个变量值的变化,都会影响到另一个变量。这里修改i1的值,i2的值同时发生改变。

测试结果如下:

34 测试结果

关于值类型与引用类型,这里只能是给您介绍一下简单的概念,让您知道值类型与引用类型的存在,更多详细信息,您可查阅其他书籍或网络搜索相关资料,这里不再累述。

以上是关于值类型与引用类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的值类型与引用类型

值类型与引用类型

值类型与引用类型

c#中值类型和引用类型的区别

值类型和引用类型的区别

c#中值类型与引用类型的值传递与引用传递