




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 中对象创建的方式 使用 new 创建 使用对象的 MemberwiseClone MemberwiseClone 方法创建一个浅表副本 方法是创建一个新对象 然后将当前 对象的非静态字段复制到该新对象 如果字段是值类型的 则对该字段执行逐位复制 如果字段是引用类型 则复制引用但不复制引用的对象 因此 原始对象及其复本 引用同一对象 using System using System IO using System Runtime Serialization Formatters Binary namespace CloneDemo Serializable class DemoClass public int i 0 public int iArr 1 2 3 public DemoClass Clone1 return this MemberwiseClone as DemoClass public DemoClass Clone2 MemoryStream stream new MemoryStream BinaryFormatter formatter new BinaryFormatter formatter Serialize stream this stream Position 0 return formatter Deserialize stream as DemoClass class Program static void Main string args DemoClass a new DemoClass a i 10 a iArr new int 8 9 10 DemoClass b a Clone1 DemoClass c a Clone2 更改 a 对象的 iArr 0 导致 b 对象的 iArr 0 也发生了变化 a iArr 0 88 Console WriteLine MemberwiseClone Console WriteLine b i foreach var item in b iArr Console WriteLine item Console WriteLine Clone2 Console WriteLine c i foreach var item in c iArr Console WriteLine item Console ReadLine 使用工厂方法创建 定义创建对象的接口 并由派生类决定那一个类来创建实例 即工厂方法将创建对象的责任委托 延 迟 到了派生类创建 适用情况 1 当一个类无法事先知道她所必须创建的对象的类的时候 2 当一个类要让其派生类决定构建对象时 3 当类将创建对象的职责委托给多个协助他的派生类之一 同时你希望通过所委托的派生类来集中管理对 象创建逻辑时 使用序列化和反序列化创建 一 概述一 概述 当两个进程在进行远程通信时 彼此可以发送各种类型的数据 无论是何种类型的数据 都会以二进制序列的形 式在网络上传送 发送方需要把这个对象转换为字节序列 才能在网络上传送 接收方则需要把字节序列再恢复为对 象 把对象转换为字节序列的过程称为对象的序列化 对象的序列化 把字节序列恢复为对象的过程称为对象的反序列化 对象的反序列化 二 对象的序列化主要有两种用途 二 对象的序列化主要有两种用途 1 把对象的字节序列永久地保存到硬盘上 通常存放在一个文件中 我们经常需要将对象的字段值保存到磁盘中 并在以后检索此数据 尽管不使用序列化也能完成这项工作 但这 种方法通常很繁琐而且容易出错 并且在需要跟踪对象的层次结构时 会变得越来越复杂 可以想象一下编写包含大 量对象的大型业务应用程序的情形 程序员不得不为每一个对象编写代码 以便将字段和属性保存至磁盘以及从磁 盘 还原这些字段和属性 序列化提供了轻松实现这个目标的快捷方法 公共语言运行时 CLR 管理对象在内存中的分布 NET 框架则通过使用反射提供自动的序列化机制 对象序列化后 类的名称 程序集以及类实例的所有数据成员均被 写入存储媒体中 对象通常用成员变量来存储对其他实例的引用 类序列化后 序列化引擎将跟踪所有已序列化的引 用对象 以确保同一对象不被序列化多次 NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用 对对象图表的唯一要求是 由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable 请参阅基 本序 列化 否则 当序列化程序试图序列化未标记的对象时将会出现异常 当反序列化已序列化的类时 将重新创建该 类 并自动还原所有数据成员的值 2 在网络上传送对象的字节序列 对象仅在创建对象的应用程序域中有效 除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable 否则 任何将对象作为参数传递或将其作为结果返回的尝试都将失败 如果对象标记为 Serializable 则该对象将被自动序列化 并从一个应用程序域传输至另一个应用程序域 然后进行反序列化 从而在第二个应用程序域中产生出该对象的一个精确副本 此过程通常称为按值封送 如果对象是从 MarshalByRefObject 派生得到 则从一个应用程序域传递至另一个应用程序域的是对象引用 而不是对象本身 也可 以将从 MarshalByRefObject 派生得到的对象标记为 Serializable 远程使用此对象时 负责进行序列化并已预先配置 为 SurrogateSelector 的格式化程序将控制序列化过程 并用一个代理替换所有从 MarshalByRefObject 派生得到的对 象 如果没有预先配置为 SurrogateSelector 序列化体系结构将遵从下面的标准序列化规则 三 三 NET NET 提供了三种序列化方式提供了三种序列化方式 1 XML Serializer 2 SOAP Serializer 3 BinarySerializer 四 基本序列化四 基本序列化 要使一个类可序列化 最简单的方法是使用 Serializable 属性对它进行标记 如下所示 Serializable public class MyObject public int n1 0 public int n2 0 public String str null BinarySerializer BinarySerializer 将此类的一个实例序列化为一个文件 MyObject obj new MyObject obj n1 1 obj n2 24 obj str 一些字符串 IFormatter formatter new BinaryFormatter Stream stream new FileStream MyFile bin FileMode Create FileAccess Write FileShare None formatter Serialize stream obj stream Close 反序列化 IFormatter formatter new BinaryFormatter Stream stream new FileStream MyFile bin FileMode Open FileAccess Read FileShare Read MyObject obj MyObject formatter Deserialize fromStream stream Close XMLSerializer XMLSerializer 将此类的实例序列化成一个 Xml 文件 XmlSerializer ser new XmlSerializer obj GetType ser Serialize new FileStream users xml FileMode Create obj 反序列化 XmlSerializer serializer new XmlSerializer Type GetType MyObject MyObject my MyObject serializer Deserialize new FileStream users xml FileMode O pen 说明 使用二进制格式化程序进行序列化 您只需创建一个要使用的流和格式化程序的实例 然后调用格式化程 序的 Serialize 方法 流和要序列化的对象实例作为参数提供给此调用 类中的所有成员变量 甚至标记为 private 的变量 都将被序列化 但这一点在本例中未明确体现出来 在这一点上 二进制序列化不同于只序列化公共字段的 XML 序列化程序 将对象还原到它以前的状态也非常容易 首先 创建格式化程序和流以进行读取 然后让格式化程 序对对象进行反序列化 SOAP SOAP Serializer Serializer 如果要求具有可移植性 请使用 SoapFormatter 所要做的更改只是将以上代码中的 BinaryFormatter 换 SoapFormatter 而 Serialize 和 Deserialize 调用不变 使用反射创建 namespace ConsoleApplication1 public class ReflectionSample private string firstName string Empty private string lastName string Empty public ReflectionSample public ReflectionSample string firstName string lastName this firstName firstName this lastName lastName public string SayHello return string Format Hello 0 1 this firstName this lastName public static string StaticHello return string Format Hello I am a static method 创建对象 方法一 1Assembly asm Assembly GetExecutingAssembly 2Object obj asm CreateInstance ConsoleApplication1 ReflectionSample true 方法二 1ObjectHandle handler Activator CreateInstance null ConsoleApplication1 ReflectionSample 第 一个参数表示程序集名称 为 null 表示当前程序集 2Object obj handler Unwrap 带参数构造函数的情况 创建参数和修改 createintance 方法 1 创建参数 2Object paras new Object 2 3paras 0 Jimmy 4paras 1 Zhang 5 6 创建对象 7Assembly asm Assembly GetExecutingAssembly 8Object obj asm CreateInstance ConsoleApplication1 ReflectionSample true BindingFlags Defa ult null paras null null 9 10 The second way 11 ObjectHandle handler Activator CreateInstance null ConsoleApplication1 ReflectionSample tr ue BindingFlags Default null paras null null null 12 Object obj handler Unwrap 使用类型推导 c 3 0 另外 c 3 0 中增加了一种类型扩展方法 扩展方法的定义 需要注意三个部分 1 静态类 私有公共都可以 2 静 态方法 私有公共都可以 3 第一个函数参数前带 this 必须是第一参数 前 namespace Hongjun Guo static class MyExtensionMethods internal static void Print this object s Console WriteLine s 扩展方法的使用 需要注意点 using 你定义所在的命名空间 using Hongjun Guo static void Main string args object o dsdgs o Print 这样一个简简单单的代码后 我们就可以很方便的对一些不开源的第三方控件 增加很多我们自己额外需要的功能 扩展方法的使用 有时候并不是这么简简单单 我们来看一些特殊情况 通过 这些特殊情况的分析 我们可以更深入的了解扩展方法 情况一 扩展方法跟原来类的方法重名时候的处理逻辑 场景 我们是对一个第三方的没有开放源代码组件的一个类扩展了一个方法 比如方法 Print 过了一段时间后 这个第三方的组件发布了新版本 该 类的增加了 Print 方法 这时候会出何种效果 问题演示代码 namespace Hongjun Guo public class MyClass public void Print Console WriteLine static class MyExtensionMethods internal static void Print this MyClass s Console WriteLine haha s ToString 调用范例 using Hongjun Guo static void Main string args MyClass o new MyClass o Print Console ReadLine 这时候我们会看到何种结果呢 答案 看到的是 也就是 扩展方法跟类的方法冲突时候 编译使用不会报任何错误 这时候以 类的方法优先级最高 这时我们使用类的方法 而不是扩展方法 分析 我们把上述两组代码编译后 再反编译成 IL 我们就可以看到 实际上 扩展 方法在 IL 层上是不存在的 扩展方法实际是编译器调用某个类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2031年中国亚克力钻贴行业投资前景及策略咨询研究报告
- 2025至2030年中国集成木材数据监测研究报告
- 2025家电加盟合同模板
- 2025至2030年中国软式脖套/颈圈数据监测研究报告
- 2025标准劳动合同书范本
- 2025至2030年中国石英异型管数据监测研究报告
- 非开挖裂缝修复施工方案
- 2025至2030年中国氟钛酸铵数据监测研究报告
- 水上拦污浮筒施工方案
- 高中地理初高中知识衔接
- 驻村队员个人工作总结
- 2025福建省泉州市房屋租赁合同范本
- 4.3.1 呼吸道对空气的处理 课件人教版(2024)七年级下册
- 中华遗产考试题目及答案
- 全厂设施色彩、标志牌统一规定
- 2024年保安员资格考试初级理论知识试题库【模拟题】
- 物业电工安全培训
- 湖南省炎德英才名校联考联合体2024-2025学年高二下学期3月月考-化学+答案
- 腾讯财经笔试题库及答案
- 2025年安徽省示范高中皖北协作区第27届联考物理+答案
- 工程招标代理服务方案
评论
0/150
提交评论