摘要:
首先最重要的一点就是结构是值类型,而类是引用类型。不能为结构声明一个自己的默认构造函数(无参的) Struct Time { public Time(){……}//编译时会出错 } 之所以不能在struct中声明自己的无参构造函数,是因为编译器将始终生成一个默认构造函数。在类中,只有在你没有写任何构造函数的前提下,编译器才会生成一个默认构造函数。 结构:假设你自己写了一个有参的构造函数,但是你没与在此构造函数中初始化所有的字段,那么编译器将不会再帮你初始化它。(但是在类中是可以的)即必须在结构的所有构造函数中显示的初始化所有字段,否则就会得到编译器错误。 比如:若Time(Time中三个字段, 阅读全文
摘要:
前言:下面先看一段程序,通过程序来引入拆箱和装箱的概念:1.装箱int i=42;Object o=i;i=50;Console.WriteLine(“i={0},o={1}”,i ,o);//输出为i=50,o=42下面分析一下为什么会是这个结果。实际情况是:首先从内存堆栈中分配一小片内存,来存储int类型的数据42,然后再分配一小片内存来存储一个引用o。接着在内存堆中分配一片内存,将i中值的一个副本存在在该内存中。最后让i的引用指向这个副本。这种将一个数据项从堆栈自动复制到堆得行为成为装箱(Boxing)。若修改一个变量的原始值,不会修改堆上现有的值,因为它只是一个副本。先将图附上,方便理 阅读全文
摘要:
OS和CLR通常将用于容纳数据的内存划分为两个独立的区域,每个区域都采用截然不同的方式来管理:堆栈(Stack)和堆(heap)。(1) 调用一个方法时,它的参数以及它的局部变量需要的内存总是从堆栈中获取,方法结束后,为参数和局部变量分配的内存将自动还给堆栈,并可在另一个方法调用时重新使用。(2) 使用new关键字和一次构造函数调用来创建一个对象时,创建对象所需的内存总是从堆中获取,使用引用变量,同一个对象可以从几个地方引用,对对象的最后一次引用消失以后,对象使用的内存就可以供重用(它可能没有被立即回收)。(3) 所有值类型都是在堆栈中创建的,所有引用类型都是在堆中创建的。2.堆内存和堆栈内存 阅读全文