上一页 1 ··· 9 10 11 12 13 14 下一页
  2011年3月26日
摘要: 关于浅拷贝和深拷贝,我的理解不是很清晰,简单说来,我认为是这样子: 浅拷贝:引用成员在被拷贝时仅复制源对象中引用成员的地址到新对象中,所以在新对象中对引用成员进行更改会影响到源对象(除对引用成员进行赋值外)。 深拷贝:引用成员在拷贝时新建一个引用对象到新对象中,且将源对象中引用对象的成员值复制到新对象的引用对象中,所以在新对象中对引用成员进行更改不会影响源对象。 说起来概念也简单,我想大家纠结的是如何实现深拷贝?浅拷贝的实现很简单,调用Object.MemberwiseClone就万事大吉了。在网上找了一个通过序列化实现深拷贝的例子,自己改了改,欢迎大家品头论足。 这段程序的输出为: obj. 阅读全文
posted @ 2011-03-26 00:26 辛勤的代码工 阅读(794) 评论(1) 推荐(0)
摘要: 创建一个引用类型的实例时,系统分以下三步骤:首先为该实例分配内存。初始化对象的附加成员(即方法表指针和一个SyncBlockIndex)调用类型的实例构造器设置对象的初始状态。 以下情况,类型实例的创建不需要调用实例构造器。调用Object的MemberwiseClone方法,它将执行以下几步:为对象分配内存,初始化对象的附加成员,将源对象的字节拷贝到新创建的对象中。反序列化一个对象时,通常也不会调用构造器。 内联方式初始化实例字段的语法,如下:class ClassA{ int i = 5;} 实际上内联方式初始化实例字段的简化语法都被转换成了构造器中的代码。这时,如果在构造器中又对字段进. 阅读全文
posted @ 2011-03-26 00:16 辛勤的代码工 阅读(284) 评论(0) 推荐(0)
  2011年3月25日
摘要: 常数是在编译时嵌入代码中,所以常数在运行时不再需要任何内存分配。我们不能获取常数的地址,或以引用的方式来传递一个常数。 如果要求一个模块中的数值能够在运行时而非编译时被另一个模块获取,那就不应该使用常数,因为常数在编译时就已经被嵌入到程序的IL代码中了。这时,应该使用只读字段。 只读字段只能在构造器内被赋值,且在构造器内只读字段可以多次被赋值。 对于静态只读字段只能在静态构造器内赋值,静态构造器在该类型初次被引用时执行。 阅读全文
posted @ 2011-03-25 23:11 辛勤的代码工 阅读(325) 评论(0) 推荐(0)
摘要: 对象的散列码: object提供了一个GetHashCode虚方法,我们可以从任何对象上得到一个Int32类型的散列码。 如果我们定义了一个类型,且重写了Equals方法,我们就应该重写GetHashCode方法。因为Hashtable类型的实现要求任何两个相等的对象都必须有相同的散列值。 object的GetHashCode方法返回的是一个在应用程序域范围内确保唯一的数值,该数值在对象的整个生存期中保证不会改变。但在对象被执行垃圾收集后,这个唯一的数值可以被重新利用作为一个新的对象的散列码。 ValueType中实现的GetHashCode方法使用反射来返回定义在类型中第一个实例字段的散列码 阅读全文
posted @ 2011-03-25 18:11 辛勤的代码工 阅读(494) 评论(2) 推荐(1)
摘要: System.Object类型提供了名为Equals的虚方法,目的为判断两个对象是否有相同的“值”。.Net框架类库(FCL)中许多方法在内部都调用了Equals方法(如:Array的IndexOf方法、ArrayList的Contains方法)。对于没有显式重写Equals的类型,Object(或重写了Equals方法的最近的那基类)提供的实现将被继承。以下代码展示了System.Object类型中的Equals方法实现: class object { public virtual Boolean Equals(object obj) { //如果引用指向的是同一对象,肯定相等 if (t. 阅读全文
posted @ 2011-03-25 17:23 辛勤的代码工 阅读(521) 评论(0) 推荐(0)
摘要: 考虑以下代码:byte b = 100;b = (byte)(b+200); 这段代码在实际运行中是否会抛出溢出异常呢? 先不管答案,我们来看看CLR是如何应对溢出的: CLR提供的IL指令允许编译器选择自己期望的行为。CLR提供了一个名为add的指令,会直接对两个数做加法运算,而不做任何溢出检查。同时,CLR还提供了一个名为add.ovf的指令,它在对两数做加法运算时,一旦发出溢出,便会抛出一个System.OverflowException异常。除这两个加法运算指令外,CLR还提供了类似的减法(sub/sub.ovf)、乘法(mul/mul.ovf),以及数据转换(conv/conv.o. 阅读全文
posted @ 2011-03-25 12:56 辛勤的代码工 阅读(622) 评论(1) 推荐(0)
摘要: 延迟签名的作用: 当我们打包强命名程序时,必须使用安全的私有密钥来为之签名。然而在开发和测试程序集时,允许访问安全的私有密钥可能会导致私钥泄漏。为在开发与测试环境中保证私钥安全,.Net推出了延迟签名技术,也叫局部签名。延迟签名的步骤:开发程序集时,首先取得仅包含公司公有密钥的文件,并将以下两个特性加入到AssemblyInfo.cs文件中://指定公有密钥文件名[assembly:AssemblyKeyFile("MyCompany.Publickey")]//指定延迟签名特性为true[assembly:AssemblyDelaySign("true" 阅读全文
posted @ 2011-03-25 10:48 辛勤的代码工 阅读(347) 评论(0) 推荐(0)
摘要: 如果一个程序集被多个应用程序所访问,为方便起见,应该将其放到一个CLR确知的目录下,这个目录即全局程序集缓存(GAC)。 全局程序集缓存所在路径一般为:c:\Windows\Assembly 向GAC中安装一个强命名程序集的常用工具为:GACUtil.exe 使用方法: 安装一个强命名程序集到GAC中 GACUtil /i xxx.dll 从GAC中删除一个强命名程序集 GACUtil /u xxx.dll GACUtil一般不会和客户应用程序一起发布,如果应用程序包括一些需要部署到GAC中的程序集,则必须的使用2.0版本以上的Windows安装器(MSI)。客户电脑上一般总是存在该工具。可. 阅读全文
posted @ 2011-03-25 10:47 辛勤的代码工 阅读(387) 评论(0) 推荐(0)
摘要: 强命名程序集的创建使用SN(Strong Name Utility)工具创建密钥例:SN -k MyCompany.keys创建一个名为MyCompany.keys的密钥文件,该文件包含一对以二进制格式存储的公有密钥和私有密钥。查看公有密钥方法创建一个只含有公有密钥的文件SN -p MyCompany.keys MyCompany.Publickey查看公有密钥SN -tp MyCompany.Publickey显示如下:Microsoft (R) .NET Framework 强名称实用工具 版本 2.0.50727.42Copyright (c) Microsoft Corporation 阅读全文
posted @ 2011-03-25 10:46 辛勤的代码工 阅读(403) 评论(0) 推荐(0)
摘要: 弱命名程序集与强命名程序集的区别:程序集部署:弱命名程序集只能进行私有部署,即只能部署在应用程序的基目录及子目录下;强命名程序集既可进行私有部署,也可进行全局部署。程序集定位:弱命名程序集可以在其清单元数据中嵌入版本号和语言文化特性,但CLR总会忽略版本号,仅利用程序集的名称进行定位,只有在搜寻子目录查找卫星程序集时才会使用其中的语言文化信息。强命名程序集包含4个唯一标识程序集的特性:文件名(不含扩展名)、版本号、语言文化标识、一个公有密钥标记(由公有密钥产生的一个值)。在定位时,唯有这4个特性完全匹配才能定位成功。 阅读全文
posted @ 2011-03-25 10:45 辛勤的代码工 阅读(387) 评论(0) 推荐(0)
上一页 1 ··· 9 10 11 12 13 14 下一页