摘要:
在编写代码的过程中,我们有可能并不希望将对象的所有属性都序列化,这时就需要自定义序列化,在.NET中自定义序列化需要继承ISerializable接口:[代码]这个接口只有一个方法,通过这个方法我们可以将需要序列化的数据序列化。info:存储将对象序列化或反序列化所需的全部数据。context:描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文。对象序列化后,当再次需要使用对象时,我... 阅读全文
摘要:
先看看下边的代码:[代码]对于初学者来说,往往会认为这段程序运行的结果是如下:[代码]但运行的结果却是如下:[代码]我们先用反汇编程序查看下:[代码]从中我们会发现,当我们调用GetType()方法的时候,a对象先进行了装箱(box),在托管堆的对象是Int32类型。在.NET中,值类型对象在调用GetType()方法的时候,都需要先进行装箱操作。 阅读全文
摘要:
泛型类可以标记为可序列化,但只有当泛型类型参数可序列化时,泛型类才可序列化。如下:[代码] 为了使泛型类可以序列化,有以下几种方法:将泛型类型参数定义的成员变量标识为NonSerialized,这样泛型类型参数的类型就不会影响到泛型类的序列化。[代码]将泛型类型参数进行约束,使其必须继承ISerializable。[代码]为泛型类添... 阅读全文
摘要:
.NET为对象序列化提供了俩个格式器,分别为:BinaryFormatter和SoapFormatter。二进制序列化速度更快,序列化后数据较小。Soap序列化比前者唯一的优点就是平台无关性。下面就讲解下如何创建一个比较通用的序列化程序: 对单个对象序列化,先定义一个接口,有两个泛型方法方法Serialize和Deserialize,分别完成序列化和反序列化,创建泛型方法是为了类型安全。... 阅读全文
摘要:
在我们使用事件的时候常常会这样写:[代码]判断事件是否有订阅,触发事件等,是经常重复写的部分,其实我们可以把他们封装起来。创建一个EventsHelper静态类,首先完成同步操作:创建以下方法:[代码]由于UnsafeFire()方法并没有检查参数类型,所以并不能保证类型安全,于是我们创建一些通用的委托,使用这些泛型委托我们可以创建一些通用的事件。因为十分长的参数并不常用,所以我只创建到参数最长7... 阅读全文
摘要:
行为函数委托(Action(T))封装一个方法,该方法只采用一个参数并且不返回值。结构:void 方法名(T obj){//处理};例:[代码]判定函数委托(Predicate(T))表示定义一组条件并确定指定对象是否符合这些条件的方法。结构:bool Match<T>(T obj){//处理}[代码]转换函数委托(Converter(TInput,TOutput))表示将对象从一种类... 阅读全文
摘要:
要做热键首先,要做的就是定义一些枚举来表示一些常量。[代码]然后,要做的就是建立一个HotKey类,这个用来保存热键的键值,热键被激活是所触发的事件,并负责注册热键,撤销热键的操作。[代码]热键我们往往并不是注册一个这时我们就需要个集合来保存这些热键。[代码]最后,热键虽然注册了,但我们没有捕获这些热键被激发的消息,这时有两种选择,一种是使用消息筛选器,这种会降低winform的处理消息的效率;另... 阅读全文