拆箱与装箱的解释

合集下载

面向对象面试题

面向对象面试题

面向对象面试题1、什么是面向对象面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP;通俗的解释就是万物皆对象,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像C那样分成一个个函数;现在纯正的OO语言主要是java和C#,C++也支持OO,C是面向过程的。

2、简述private、protected、public、internal 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 当前程序集内可以访问。

3、中的五个主要对象Connection:主要是开启程序和数据库之间的连结。

没有利用连结对象将数据库打开,是无法从数据库中取得数据的。

这个物件在 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。

Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。

这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Comm and 对象下达命令后,并将取得的数据放入DataSet 对象中。

这个对象是架构在Command 对象上,并提供了许多配合DataSet 使用的功能。

DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。

DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。

DataSet 对象可以说是 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。

C#编程基础练习题与答案

C#编程基础练习题与答案

1.面向对象的思想主要包括什么?答:个人认为一各程序语言要成为真正的面向对象的程序设计语言,它必须符合下列条件: 1抽象(abstraction)—抽象能够有效地管理一个问题的复杂性,其作法是划分出与该问题相关的一组对象.2 封装(Encapsulation)—封装是指将一个抽象的内部实现隐藏在特定的对象之内.3 多态(polymorphism)—多态会提供相同方法的多种操作方法的多种操作实作.例如,不同的对象都会拥有一个Save方法,但是每一个Save方法会执行不同的操作.4 继承(inheritance)—Visual C# 2005 最令人兴奋之处就是其继承特性.v c#2005则提供了真正的方法继承,因此您可以重复使用一个类的实例.2.什么是中的用户控件自己动手作自己的控件来取代.NET提供的控件。

这种控件就是用户控件。

后缀为.ascx3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?什么是多态? CTS、CLS和CLR分别作何解释?应用程序域:应用程序域(通常是AppDomain)是用于隔离应用程序的虚拟进程。

在同一个应用程序作用域中创建的所有对象(换句话说,从该应用程序的入口点开始沿着对象激活序列的任何地方)都在同一个应用程序域中创建。

多个应用程序域可以存在于一个操作系统进程中,使它们成为隔离应用程序的简便方式。

操作系统进程通过使用各不相同的内存地址空间来提供隔离。

尽管它是有效的,但也是代价昂贵的,并且不能达到大型Web 服务器所需要的数量。

与其相比,公共语言运行时通过管理在应用程序域中运行的代码的内存使用来强制进行应用程序隔离。

这样就确保它不会访问应用程序域以外的内存。

需要注意的是,只有类型安全的代码才能以这种方式管理(当在应用程序域中加载不安全代码时,运行时不能保证隔离)。

理解应用程序域:应用程序域是.NET 运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。

仓储服务中的货物装箱与拆箱流程是怎样的?

仓储服务中的货物装箱与拆箱流程是怎样的?

仓储服务中的货物装箱与拆箱流程是怎样的?一、货物装箱的准备工作在进行货物装箱之前,需要进行一系列的准备工作。

首先,需要对货物进行分类、计量和清点,确保货物的种类和数量准确无误。

其次,需要对货物的包装进行检查和修整,确保包装完好无损,以便保护货物的安全。

二、货物装箱的流程1. 选择合适的包装材料在进行货物装箱时,需要选择合适的包装材料。

根据货物的性质和特点,选择不同的包装材料,如纸箱、木箱、塑料箱等,保证货物在运输过程中的安全。

2. 安排合理的装箱顺序在进行货物装箱时,需要根据货物的性质和尺寸,合理安排装箱的顺序。

通常,较重的货物应放置在箱子的底部,轻巧易损的货物应放置在较上层。

此外,还需要注意货物的稳定性和平衡性,避免在运输过程中发生倾斜或倒塌的情况。

3. 使用科学的固定方法在进行货物装箱时,需要采用科学的固定方法,确保货物在运输过程中不发生移动或挤压。

可以使用填充物、绑带、封口胶带等工具,将货物固定在箱子中,防止货物的损坏。

4. 进行标识和记录在进行货物装箱时,还需要进行标识和记录。

可以在箱子上标注货物的名称、数量和重量等信息,方便后续的识别和管理。

同时,还需要在相关文件中记录装箱的日期、责任人和目的地等信息,便于货物的追踪和追溯。

三、货物拆箱的流程1. 拆除固定物品在进行货物拆箱之前,首先需要拆除固定物品。

将固定物品,如填充物、绑带和封口胶带等逐一拆除,确保货物可以顺利取出。

2. 注意货物的顺序和位置在进行货物拆箱时,需要注意货物的顺序和位置,避免货物的混乱和交叉。

可以根据标识和记录的信息,有序把货物从箱子中取出,并按照原先的位置放置,以免混淆或丢失。

3. 进行货物清点和检查在进行货物拆箱过程中,还需要进行货物的清点和检查,确保货物的种类和数量与装箱时一致。

同时,还需要检查货物的包装和质量,确保货物没有损坏或丢失。

4. 做好拆箱记录和整理在进行货物拆箱时,需要及时做好拆箱记录,并对箱子进行整理和清理。

C#面试题整理(带答案)

C#面试题整理(带答案)

C#⾯试题整理(带答案)1.维护数据库的完整性、⼀致性、你喜欢⽤触发器还是⾃写业务逻辑?为什么?答:尽可能⽤约束(包括CHECK、主键、唯⼀键、外键、⾮空字段)实现,这种⽅式的效率最好;其次⽤触发器,这种⽅式可以保证⽆论何种业务系统访问数据库都能维持数据库的完整性、⼀致性;最后再考虑⽤⾃写业务逻辑实现,但这种⽅式效率最低、编程最复杂,当为下下之策。

2.什么是事务?什么是锁?答:事务是指⼀个⼯作单元,它包含了⼀组数据操作命令,并且所有的命令作为⼀个整体⼀起向系统提交或撤消请求操作,即这组命令要么都执⾏,要么都不执⾏。

锁是在多⽤户环境中对数据的访问的限制。

SqlServer⾃动锁定特定记录、字段或⽂件,防⽌⽤户访问,以维护数据安全或防⽌并发数据操作问题,锁可以保证事务的完整性和并发性。

3.什么是索引,有什么优点?答:索引象书的⽬录类似,索引使数据库程序⽆需扫描整个表,就可以在其中找到所需要的数据,索引包含了⼀个表中包含值的列表,其中包含了各个值的⾏所存储的位置,索引可以是单个或⼀组列,索引提供的表中数据的逻辑位置,合理划分索引能够⼤⼤提⾼数据库性能。

4.视图是什么?游标是什么?答:视图是⼀种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进⾏增该查操作;视图通常是⼀个或多个表的⾏或列的⼦集;视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相⽐多表查询更⽅便),限制数据检索(⽐如需要隐藏某些⾏或列),维护更⽅便。

游标对查询出来的结果集作为⼀个单元来有效的处理,游标可以定位在结果集的特定⾏、从结果集的当前位置检索⼀⾏或多⾏、可以对结果集中当前位置进⾏修改、5.什么是存储过程?有什么优点?答:存储过程是⼀组予编译的SQL语句它的优点:1.允许模块化程序设计,就是说只需要创建⼀次过程,以后在程序中就可以调⽤该过程任意次。

2.允许更快执⾏,如果某操作需要执⾏⼤量SQL语句或重复执⾏,存储过程⽐SQL语句执⾏的要快。

装箱跟拆箱的概念

装箱跟拆箱的概念

装箱跟拆箱的概念
装箱和拆箱是两个在计算机科学中常用的术语,主要用于描述将数据从一种类型转换为另一种类型的操作。

装箱(boxing)是指将一个值类型(如整数、浮点数、字符等)封装为对应的引用类型(如整数类、浮点数类、字符类等)的过程。

在Java中,装箱通常是由编译器自动完成的,例如将int类型的整数自动装箱为Integer类型的对象。

装箱的过程会对原始数据进行封装,使其具有更多的功能,但也会引入一定的性能开销。

拆箱(unboxing)是指将一个引用类型(如包装类对象)解包为对应的值类型(如基本数据类型)的过程。

在Java中,拆箱通常也是由编译器自动完成的,例如将Integer类型的对象自动拆箱为int类型的整数。

拆箱的过程会将引用类型的数据还原为原始的值类型,以便进行计算或其他操作。

装箱和拆箱的概念在Java中特别重要,因为一些集合类(如List、Set)只能存储引用类型的数据,而不能直接存储值类型的数据。

因此,在需要将值类型数据存储到集合类中时,编译器会自动进行装箱操作,将值类型数据封装成引用类型对象存储到集合中;在需要从集合中取出数据进行计算时,编译器会自动进行拆箱操作,将引用类型对象还原为原始值类型进行计算。

这使得值类型的数据可以和引用类型的数据一样方便地在集合类中进行操作。

装箱与拆箱的理解(Theboxingandunboxingunderstanding)

装箱与拆箱的理解(Theboxingandunboxingunderstanding)

装箱与拆箱的理解(The boxing and unboxing understanding)About C# boxing and unboxing understandingNET (Common, Type, System), one of the most important technologies and foundations of CTS. As the name suggests, CTS is a generic type system that exists to implement rules that must be followed when applications declare and use these types. .Net divides the whole system into two broad categories -- Value, Type, and Reference Type.. Most OO languages have this weakness because they don't have common ground points for their original types, so they are not really objects in nature, and C++ relies more on objects than objects. The CTS of environment brings convenience to us. First, everything in CTS is an object; second, all objects are derived from a base class -- the System.Object type. This is called the single rooted (singly hierarchy). For more information about System.Object, please refer to Microsoft's technical documentation. One of the biggest features of CTS Value Type is that they cannot be null, and Value Type variables always have a value. When passing the variables of Value Type, the values of the variables are actually passed, rather than the references to the underlying objects". CTS Reference Type is like a pointer to type safety, which can be null. When the value is null, no reference or type is pointed to an object. When a variable of a reference type is declared, it is manipulated by the reference (address) of this variable, not the data.1,Boxing and unboxing is an abstract concept2,The packing is the value type to a reference type; unboxing convert a reference type to a value typeThe use of boxing and unboxing function, through the allowable value of conversion between the type of any value and Object value, types and reference types to link the valueSuch as:Int Val = 100;Object obj = val;Console.WriteLine (object value = {0}, obj);This is a boxing process that converts a value type into a reference typeInt Val = 100;Object obj = val;Int num = (int) obj;Console.WriteLine ("num: {0}", num);This is a process of unpacking, is to convert a value type to a reference type, then the reference type into a value typeNote: the box is over the object to be unpackedIn 3,.NET, the data types are divided into values, types, and references (not equivalent to pointers to C++). In this case, the memory allocation is divided into two ways, one for the stack and the other for the heap. Note: the managed heap.Value types are allocated only in the stack.Reference types allocate memory and managed heaps.The managed heap corresponds to garbage collection.4: what is the packing / unpacking?Boxing: used to store value types in garbage collection heap. Bin is implicit conversion of value types to object types or any interface type that is implemented by this value type.Unboxing: from object type to a value type or from the implementation of the interface interface type to a value type.5: why need packing? (why do you want to change a value type to a reference type? )One of the most common scenarios is to call a method with a parameter of type Object that can support any type of Object for general purpose. When you need to pass a value type, such as Int32, you need to pack.Another use is a non generic container that also defines theelement type as Object in order to guarantee generic use. Therefore, you need to pack the value type data into the container.6: packing / unpacking the internal operation.Boxing:The value type assigns an object instance to the heap and copies the value to the new object. Proceed in three steps.The first step: new allocation of managed heap memory (size to value type, instance size, plus a method, table pointer, and a SyncBlockIndex).The second step: copy the instance field of the value type into the newly allocated memory.The third step: returns the address of the new allocation object in the managed heap. This address is a reference to the object.It is understood that if Int32 is boxed, the returned address points to a Int32. I don't think that's the way it is, but it does have a problem. One is not comprehensive, and the other is pointing to Int32 and not telling its substance (in the managed heap).Unboxing:Check the object instance to make sure it is a boxed value for the given value type. Copies this value from an instance to avalue type variable.A book, just get the part of the unpacking pointer type to the value reference object, and the content is the trigger copy assignment statement. I don't think it's important. The key is the essence of the inspection object instance, unpacking and packing type must match this point, in the IL layer, do not see the principle where, I guess, perhaps calling a method like GetType to remove the type matching (because the need for strict matching).7: the effect of packing / unpacking efficiencyObviously, it can be seen from principle that when the case is packed, the new reference object is generated, which has time consumption, which is the result of reduced efficiency.How should that be done?First of all, packing should be avoided as much as possible.Two kinds of situations such as example 2, all can be avoided, in the first case, can be avoided by overloaded function. In the second case, generics can be avoided.Of course, everything is not absolute. Suppose you want to change the code into a third party assembly. You can't change it, so you can only fill it up.For the optimization of packing / unpacking code, because the C# of boxing and unboxing are implicit, so, the basic methodis to analyze the code and analysis the most direct way is to understand the principle of how the anti node compiled IL code. For example, there may be excess packing in the loop, and you can simply use the method of packing in advance.8: to further understand the packing / unpackingPacking / unpacking and as mentioned above, so simple, such as packing, to refer to objects will be more of a table pointer, this will be what use is it?We can use examples to explore further.For instance。

C#的数据类型

C#的数据类型

C#的数据类型主要分为两大类:值类型和引用类型一、值类型1、简单类型1-1整数类型整数类型的数据值只能是整数。

1-2浮点类型小数在C#中采用浮点类型的数据来表示(1)单精度(float):取值范围在±1.5×10-45~3.4×1038之间,精度为7位数;(2)双精度(double):取值范围在±1.5×10-324~3.4×10308之间,精度为15~16位数。

1-3小数类型小数(Decimal)类型数据是高精度的类型数据,占用16个字节(128位),取值范围在±1.0×10-28~7.9×1028之间,精度为29位数。

(1)一般情况下,浮点类型数据和小数类型数据之间没有隐式转换(2)小数类型数据后面必须跟m或者M后缀,否则会被解释成浮点类型1-4布尔类型布尔数据类型用于表示逻辑真或逻辑假,有两种取值:true和false。

在C#语言的表达式中,使用布尔值进行判别时,必须使用布尔类型数据1-5字符类型C#提供的字符类型数据按照国际上公认的标准,采用Unicode字符集。

一个Unicode字符集的长度为16位,可以直接对字符变量赋值,也可以通过十六进制转义字符(以\x开始)或者Unicode表示法(以\u开始)给字符型变量赋值。

2、枚举类型枚举(enum)型数据实际上是为一组逻辑上密不可分的数值提供一个便于记忆的符号,该类型数据的值只限于列举出来的值。

枚举类型数据的特点:(1)编译系统对枚举类型数据按常量处理,故枚举类型数据又称枚举常量,程序中不能对枚举类型数据进行赋值操作;(2)枚举类型数据作为常量是有值的,编译系统按照其在枚举型定义中的位置顺序,默认情况下值为0、1、2…,也可以给元素直接赋值;(3)枚举型数据可以用来做判断比较,其比较规则按其在定义时的顺序号。

枚举类型数据中常用的方法:3、结构类型结构类型数据采用struct进行声明。

C#面试题

C#面试题

C#面试题1,请你说说.NET中类和结构的区别答:结构和类具有大体的语法,但是结构受到的限制比类要多。

结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数。

结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是引用类型,改变其变量的值会改变其原值。

申明结构用Struck 关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。

与类不同,结构的实例化可以不使用New关键字。

类可以实现接口。

3,接口是否可以继承接口抽象类是否可以实现接口抽象类是否可以继承实体类答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。

4,构造器Constructor是否可以被继承是否可以被Override答:Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).5,当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法答:不可以,一个对象的方法只能由一个线程访问。

6, C#是否可以对内存直接进行操作答:这个问题比较难回答,也是个很大的问题。

但是可以这样问答。

C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe,,在.net中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在C#中不可以直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。

7, Error和Exception有是区别答:error表示恢复不是不可能,但是很困难,exception表示一种实际或实现问题,它表示程序运行正常不可以发生的。

8,谈谈final,finally,finallize的区别答:final用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

拆箱概念1. 装箱和拆箱是一个抽象的概念。

2. 装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型;利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。

例如:intval = 100;objectobj = val;Console.WriteLine (“对象的值= {0}", obj);这是一个装箱的过程,是将值类型转换为引用类型的过程。

intval = 100;objectobj = val;intnum = (int) obj;Console.WriteLine ("num: {0}", num);这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程。

注:被装过箱的对象才能被拆箱3. .NET中,数据类型划分为值类型和引用(不等同于C++的指针)类型,与此对应,内存分配被分成了两种方式,一为栈,二为堆,注意:是托管堆。

值类型只会在栈中分配;引用类型分配内存与托管堆;托管堆对应于垃圾回收。

4. 装箱/拆箱是什么?装箱:用于在垃圾回收堆中存储值类型。

装箱是值类型到object 类型或到此值类型所实现的任何接口类型的隐式转换。

拆箱:从object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

5. 为何需要装箱?(为何要将值类型转为引用类型?)一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。

当你需要将一个值类型(如Int32)传入时,需要装箱。

另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。

于是,要将值类型数据加入容器时,需要装箱。

6. 装箱/拆箱的内部操作。

装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。

按三步进行。

第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。

第二步:将值类型的实例字段拷贝到新分配的内存中。

第三步:返回托管堆中新分配对象的地址。

这个地址就是一个指向对象的引用了。

有人这样理解:如果将Int32装箱,返回的地址,指向的就是一个Int32。

我认为也不是不能这样理解,但这确实又有问题,一来它不全面,二来指向Int32并没说出它的实质(在托管堆中)。

拆箱:检查对象实例,确保它是给定值类型的一个装箱值。

将该值从实例复制到值类型变量中。

有书上讲,拆箱只是获取引用对象中指向值类型部分的指针,而内容拷贝则是赋值语句之触发。

我觉得这并不要紧。

最关键的是检查对象实例的本质,拆箱和装箱的类型必需匹配,这一点上,在IL层上,看不出原理何在,我的猜测,或许是调用了类似GetType之类的方法来取出类型进行匹配(因为需要严格匹配)。

7. 装箱/拆箱对执行效率的影响显然,从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。

那该如何做呢?首先,应该尽量避免装箱。

比如上例2的两种情况,都可以避免,在第一种情况下,可以通过重载函数来避免。

第二种情况,则可以通过泛型来避免。

当然,凡事并不能绝对,假设你想改造的代码为第三方程序集,你无法更改,那你只能是装箱了。

对于装箱/拆箱代码的优化,由于C#中对装箱和拆箱都是隐式的,所以,根本的方法是对代码进行分析,而分析最直接的方式是了解原理结何查看反编译的IL代码。

比如:在循环体中可能存在多余的装箱,你可以简单采用提前装箱方式进行优化。

8. 对装箱/拆箱更进一步的了解概述拆箱是将引用类型转换为值类型利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来例如:intval = 100; object obj = val; Console.WriteLine (“对象的值= ", obj); 这是一个装箱的过程,是将值类型转换为引用类型的过程intval = 100; object obj = val; intnum = (int) obj; Console.WriteLine ("num: ", num); 这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程举例说明装箱/拆箱并不如上面所讲那么简单明了,比如:装箱时,变为引用对象,会多出一个方法表指针,这会有何用处呢?我们可以通过示例来进一步探讨。

StructA :ICloneable {public Int32 x;public override String ToString() { return String.Format(”{0}”,x); }public object Clone() { return MemberwiseClone(); } }static void main(){A a;a.x = 100;Console.WriteLine(a.ToString());Console.WriteLine(a.GetType());A a2 = (A)a.Clone();ICloneable c = a2;Ojbect o = c.Clone();}5.0:a.ToString()。

编译器发现A重写了ToString方法,会直接调用ToString的指令。

因为A是值类型,编译器不会出现多态行为。

因此,直接调用,不装箱。

(注:ToString是A的基类System.ValueType 的方法)5.1:a.GetType(),GetType是继承于System.ValueType的方法,要调用它,需要一个方法表指针,于是a将被装箱,从而生成方法表指针,调用基类的System.ValueType。

(补一句,所有的值类型都是继承于System.ValueType的)。

5.2:a.Clone(),因为A实现了Clone方法,所以无需装箱。

5.3:ICloneable转型:当a2为转为接口类型时,必须装箱,因为接口是一种引用类型。

5.4:c.Clone()。

无需装箱,在托管堆中对上一步已装箱的对象进行调用。

附:其实上面的基于一个根本的原理,因为未装箱的值类型没有方法表指针,所以,不能通过值类型来调用其上继承的虚方法。

另外,接口类型是一个引用类型。

对此,我的理解,该方法表指针类似C++的虚函数表指针,它是用来实现引用对象的多态机制的重要依据。

9. 如何更改已装箱的对象对于已装箱的对象,因为无法直接调用其指定方法,所以必须先拆箱,再调用方法,但再次拆箱,会生成新的栈实例,而无法修改装箱对象。

有点晕吧,感觉在说绕口令。

还是举个例子来说:(在上例中追加change方法)public void Change(Int32 x) {this.x = x;}调用:A a = new A();a.x = 100;Object o = a; //装箱成o,下面,想改变o的值。

((A)o).Change(200); //改掉了吗?没改掉。

没改掉的原因是o在拆箱时,生成的是临时的栈实例A,所以,改动是基于临时A的,并未改到装箱对象。

(附:在托管C++中,允许直接取加拆箱时第一步得到的实例引用,而直接更改,但C#不行。

)那该如何是好?嗯,通过接口方式,可以达到相同的效果。

实现如下:interfaceIChange {void Change(Int32 x);}struct A : IChange {…}调用:((IChange)o).Change(200);//改掉了吗?改掉了。

为啥现在可以改?在将o转型为IChange时,这里不会进行再次装箱,当然更不会拆箱,因为o已经是引用类型,再因为它是IChange类型,所以可以直接调用Change,于是,更改的也就是已装箱对象中的字段了,达到期望的效果。

10. 将值类型转换为引用类型,需要进行装箱操作(boxing):1)首先从托管堆中为新生成的引用对象分配内存。

2)然后将值类型的数据拷贝到刚刚分配的内存中。

3)返回托管堆中新分配对象的地址。

可以看出,进行一次装箱要进行分配内存和拷贝数据这两项比较影响性能的操作。

将引用内型转换为值内型,需要进行拆箱操作(unboxing):1)首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。

2)将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。

经过这2步,可以认为是同boxing是互反操作。

严格意义上的拆箱,并不影响性能,但伴随这之后的拷贝数据的操作就会同boxing操作中一样影响性能。

拆箱与装箱的解释值类型转换成引用类型的过程叫装箱引用类型转换成值类型叫折箱例://装箱inti=123;object o=i;//装箱inti=456;Console.WriteLine("值类型的值为"+i); //这里显示456Console.WriteLine("引用类型的值为"+o); //这里显示123解释:当i是值类型,所以当i值改变时,只能改变它自己的值,无法修改引用类型o的值...可以理解为创建objcet实例,并将i的值复制给这个o//拆箱//上面已经把i装箱成object,现在把o拆箱int j = (int)o; //o 是object,要把它赋值给int型的变量,必须将o转换成int型...。

相关文档
最新文档