随笔分类 - C#
摘要:ManualResetEvent和AutoResetEvent 比较ManualResetEvent和AutoResetEvent都继承自EventWaitHandler,它们的唯一区别就在于父类 EventWaitHandler的构造函数参数EventResetMode不同,这样我们只要弄清了参数...
阅读全文
摘要:前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路。今天在搜索资料的时候无意中再次看到AutoResetEvent这个东西,当然我知道它是和线程有关,用于处理线程切换之类的(可能在测试Demo之前理解有误),于是决定用A...
阅读全文
摘要:前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”。虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样产生了。序列化是将一个对象转换成一个字节流的过程。反序列化是将一个字节流转换回对象的过程。在对象和字节流之间转换是很有用的一个机制。(当然这个还不能回答它的实际用处)举点例子:应用程序的状态可以保存到一个磁盘文件或数据库中,并在应用程序下次运行时恢复。比如ASP.NET就是利用系列化和反序列化保存和恢复回话状态。一组对象可以轻松复制到系统的剪切板,然后再粘贴到其他的地方(应用程序)。一组对象可克隆
阅读全文
摘要:前言:反射在C#中虽然不常用(如果不需要动态加载xx.dll),但是有时候却是设计某个程序或者完成某类功能比较好用的技术。比如:一个支持动态扩展的程序,这样就需要动态加载dll,动态创建加载dll的程序集,最终完成操作。一、加载程序集对于程序集的加载一般会使用两个方法来进行:1.Assembly.Load(string assemblyName),AssemblyName为程序集的长格式名称。 Assembly SampleAssembly = Assembly.Load("SampleAssembly, Version=1.0.2004.0, Culture=neutral, Pu
阅读全文
摘要:前言:不管是自定义的一些特性,或者是C#中内置的特性,均继承自Attribute这个类,这个类也提供了一些方法,方便我们使用。Attribute类有三个静态方法:1.IsDefined,如果有指定的Attribute的实例与目标关联,则返回true。 2.GetCustomAttributes,返回一个数组,其中每个元素都是应用于目标的指定attribute类的一个实例。该方法通常用于已将AllowMultiple设为true的attribute,或者用于列出已应用的所有attribute。3.GetCustomAttribute返回应用于目标的指定attribute类的...
阅读全文
摘要:名词解释:享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。必要元素:1.一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在);2.所有具体享元类的父类或接口,通过这个接口,Flyweight可以接受并作用于外部状态;3.继承Flyweight父类或者实现Flyweight接口,并为内部状态增加存储空间;4.指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但是并不强制共享(即那
阅读全文
摘要:名词解释:中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而可以独立地改变它们之间的交互。必要元素:抽象对象类:就是用于交互的对象的抽象类;具体类:继承自抽象对象类(也就是用于交互的一个个对象的类);抽象中介者:定义了具体对象到中介者对象的接口;具体中介者对象:实现抽象类的方法,它需要知道所有具体对象类,并从具体类接收消息,向具体对象发出命令。例子:抽象中介者类: abstract class Mediator { public abstract void Send(string message,Colleague colleagu...
阅读全文
摘要:名词解释:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,直到有一个对象处理它为止。必要元素:1.定义一个处理请示的接口;2.具体处理类,处理它所负责的请求,可访问它的后继者,如果可以处理该请求,就处理,否则就将该请求转发给它的后继者。上例子:Handler:class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor ...
阅读全文
摘要:名词解释:命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作.必要元素:1.用于执行操作的接口(抽象类);2.一个或者多个实现(继承)自操作接口的类;3.用于执行命令的类;4.接收者,用于实施与请求相关的操作。上例子:命令接口: abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver...
阅读全文
摘要:名词解释:合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。合成和聚合都是关联的特殊种类。聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样(即同时销毁和存在)。合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。抽象与它的实现分离,实现指的是抽象类和它的派生类来实现自己的对象。必
阅读全文
摘要:名词解释:组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。必需元素:1.组合中的对象的接口(Component),在适当情况下,实现所有类共有接口的默认行为。在类中定义一些用于访问和管理Component子部件;2.在组合中表示叶节点对象的类(叶节点木有子节点);3.定义有枝节点行为,可以存储子部件的类。(会实现Component中关于子部件操作的方法,一般为Add和Remove)上例子:Component,节点抽象类:/// /// 部件的抽象类 /// abstract class Component...
阅读全文
摘要:名词解释:备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。使用场景:你在玩游戏,突然有事,此时如果关闭电脑,进度肯定木有了,然后你就点击保存,关闭电脑出去了;完事之后,你又点击加载进度,又开始玩了,这个就是一个标准的备忘录模式场景。必需元素:发起人:负责创建一个备忘录,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态 。发起人可根据需要决定备忘录存储发起人的哪些内部状态。备忘录:负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录。备忘录有两个接口,管理者只能看到备忘录的窄接口,它只能将备忘录
阅读全文
摘要:名词解释:适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。使用场景:系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。(用最简单的一句话说就是,有两个比较相似的类,但是具有不同的接口时要使用它,也就是在双方都不太容易修改的时候再使用适配器模式适配。)必要元素:1.客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口;2.要适配的类;3.一个用于包装需要适配类的类。上
阅读全文
摘要:名词解释:简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建。工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。区别:简单工厂的优点是工厂类中包含了逻辑(即通过判断,实例化对应的类型),对于客户端来说去除了与具体产品的依赖。但是如果有了新功能则就需要修改这个判断的逻辑(也就是违背了开放-封闭原则),所以这个也是工厂方法出现的必要性。工厂方法呢每一个类都有自己的工厂,当然也有抽象的工厂基类,这样客户端想实例哪种类型,只需实例化其对应的工厂
阅读全文
摘要:名词解释:外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义一个高层接口,这个接口使得这一子系统更加容易使用。必要元素:一个外观类和多个子系统类(外观类中注入各个子系统类)。上例子:四个系统类:class SubSystemOne { public void MethodOne() { Console.WriteLine("子系统方法一"); } } class SubSystemTwo { public void MethodTwo() { Co...
阅读全文
摘要:写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法。准备工作:1.创建解决方案WCFService(当然名字可以任意哦)依次添加四个项目,如上图,Client和Hosting为控制台应用程序,Service和Service.Interface均为类库。2.引用关系Service.Interface:定义服务契约(Service Contract)接口,引用WCF核心库System.ServiceModel.dll;Service:定义服务的项目,由于需要实现具体的服务,而服务契约在Service.Interfac
阅读全文
摘要:装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。上图为装饰模式的结构图,Component定义一个对象接口可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责(ConcreteComponent主要就是作为一个具体的对象存在)。Decorator,装饰抽象类,继承自Component,从外类扩展Component类的功能,相对于Component来说无需知道Decorator存在。ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的
阅读全文
摘要:策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式的例子使用商场收银再好不过了,商场默认为正常收银;如果有打折,比如是打8折;如果有满减,满100减20;再或者满100送10积分;也可能是打折后满200减20等等这样的很多方式。而这些一个个方式也就是一个个不同的算法,根据策略模式的定义,将这些一个个算法分别封装起来(即有自己的一个个类),然后客户端想怎么用就怎么用。策略模式三元素:1.Context上下文,用一个属性或者是一个方法来配置,维护一个策略的对象; 2.策略类(策略接口),定义所有支持算法的接口; ...
阅读全文
摘要:工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。简单工厂 VS 抽象工厂:关于这两个模式的区别,我思考了下。简单工厂只所以简单,是因为它只是把创建一个类的过程进行了封装(这些类一般来说有一个公共的基类),通过Switch或者其他的判断形式创建需要的类(当然也是可以使用反射);而抽象工厂创建的类更为复杂,通常来说创建的类(子类)有同一基类,而在不同情形下选择对应的子类。情形重现:说到抽象工厂,必定想到对于不同数据库怎么快速切换类对象,也就是说可以很方便简单创建自己想到的类对象,废话不多说。实体类接口: interface IUser { void ...
阅读全文
摘要:在程序中如果希望某一个对象(类或者是窗体等任何的对象)只创建一次也就是至始至终使用同一个实例,那么我们就会用到了单例模式,对于单例模式有两种方式可以实现:1.私有构造函数+私有静态对象实例+公有访问方法 class MySingle { //控制线程加锁对象 private static readonly object obj = new object(); //私有对象实例 private static MySingle instance; /// /// 私有构造函数 /// ...
阅读全文