摘要:
静态类内部只包含static成员。这种类的唯一作用就是将一组相关的成员组合在一起。在c#中用static关键字定义不可实例化的类,只能应用于类,不能用于结构。因为CLR总是允许值类型实例化。c#编译器对静态类进行了限制:1、静态类必须直接从Object类直接继承2、静态类不能实现接口,只有类的实例才能调用接口方法。3、静态类只能包含静态成员4、静态类不能作为字段、方法参数和局部变量使用,他们都是类的实例。 阅读全文
摘要:
CLR支持两种类型:引用类型和值类型。引用类型总是从托管堆上分配的。c#中的New操作符返回对象的内存地址。引用对象的注意点:1、内存从托管堆中分配2、堆上分配对象,有一些额外的操作,影响一些性能的3、从托管堆中分配一个对象时,可能强制执行一次垃圾回收。CLR中的值类型是轻量级的。不需要提领一个指针,不需要垃圾回收,可以减少垃圾回收的次数。在CLR中一般称为“类”的都是引用类型,所有的值类型都称为结构或者枚举。所有的结构都是抽象类ValueType的直接派生类。ValueType是直接从Object派生的。所有的枚举都是从Enum抽象类中派生的,Enum又是从ValueType派生的。一个值类 阅读全文
摘要:
命名空间:用于对相关的类型进行逻辑分组,使用命名空间方便定位一个类型。使用类的全权名:System.Text.StringBuilder sb = new System.Text.StringBuilder();上面的写法很繁琐,使用using语句引入命名空间:using System.Text;StringBuilder sb = new StringBuilder();对于编译器来说,命名空间就是为一个类型附加一些分隔符号,使名称更有唯一性。c#的using指令是可选的,完全可以用类型的完整名称代替,c# 的using指令时指示编译器为每一个类型附加不同的前缀,确定匹配的完整名称。CLR不 阅读全文
摘要:
CLR最重要的特性之一就是类型安全性。在运行时,CLR总是知道一个对象是什么类型。调用GetType方法可以返回类型。CLR允许将一个对象转换为它的实际类型,或者它的基类型。在C#中,可将一个对象隐式转换为它的基类型,将对象转换成派生类型需要显示转换。例:object o = new Emplee();Emplee e = (Emplee)o;但是如果将一个对象转换成自己的派生类型是,会运行时报错:object o = new object();Emplee e = (Emplee)o;所以CLR是类型安全的。c#中is as的操作符用法在c#语言中,进行类型转换的另一个方式是使用is as操 阅读全文
摘要:
CLR要求每一个类型都最终从object类型派生,如下:class Typer {} === class Typer :object {}上面是完全相等的。所有的类型最终从object派生,每一个类型都有一组最基本的方法:Equals:如果两个对象相等,返回TrueGetHashCode:返回对象值的一个哈希码ToString:默认返回类型的完整名称,int等类型被重写GetType:返回调用的那个对象的类型此外,从object派生类型能访问受保护的方法 MemberWiseClone:返回一个新实类Finalize:虚方法,在内存回收之前调用CLR要求所有的对象都用NEW操作符来创建:1、计 阅读全文
摘要:
桥接模式:将对象部分与它的实现部分分离,使它们可以独立的变化。结构图: class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } class RefinedAbstraction : Abstraction { public override . 阅读全文
摘要:
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。结构图://单线程 class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }//多线程 class Singleton2 { private static Singleton2 instance; privat 阅读全文
摘要:
组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。需求中式体现部分与整体层次的结构时,统一地使用组合对象中的所有对象时,应该考虑使用组合模式。结构图:抽象对象: abstract class Component { protected string name; public Component(string name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove(Component c); pub 阅读全文
摘要:
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在这个对象之外的地方保存这个状态,这样以后就可将该对象恢复到原来保存的状态了。结构图:Memento类:保存状态的容器 class Memento { public string State { get; set; } public Memento(string state) { this.State = state; } }Caretaker是保存Memento类: class Caretaker { public Memento Memento { get; set; } }Originator类就是需要保存状态的类: class 阅读全文
摘要:
适配器模式:将一个类的接口转换成客户希望的另一个接口,Adapter使原本由于接口不兼容而不能一起工作的那些类可以一起工作。结构图:客户可以对接的接口类: class Target { public virtual void Request() { Console.WriteLine("普通请求!"); } }客户需要使用适配器才能使用的接口: class Adaptee { public void SpecialRequest() { Console.WriteLine("特殊请求!"); } }适配器的定义:继承与Target类 class Adap 阅读全文
摘要:
状态模式:当一个对象的内在状态改变时,允许改变其行为。这个对象看起来像是改变了其类。主要解决是当控制一个对象状态装换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同的状态的一系列类中。可以把复杂的逻辑简化。状态模式的结构图:先定义一个抽象状态类: abstract class State { public abstract void Handle(Context context); }ConcreteStateA、 ConcreteStateB:继承State class ConcreteStateA : State { public override void Handle(Co 阅读全文
摘要:
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者。当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。观察者结构图: 使用场景:老板回来通知员工需要进入工作状态。定义观察者的抽象类: abstract class Observer { protected string name; protected ISubject sub; public Observer(string name, ISubject sub) { this.name = name; this.sub 阅读全文
摘要:
建造者模式:是在当创建复杂对象的算法,应该独立于改对象的组成部分以及它们的装配方式的使用模式,好处是使得建造者代码与表示代码分离。结构图:需要建造的对象(一般是复杂对象): class Product { IList<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("产品创建"); foreach (string part in parts) { Co 阅读全文
摘要:
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个借口使得这子系统容易使用。1、在设计初期阶段,应该要有意识的将不同的两层分离,比如考虑数据访问层、业务逻辑层、表示层之间建立外观模式,这样可以为子系统提供简单一致的接口,使得耦合大大降低。2、开发阶段,子系统内部由于不够重构变得非常复杂,增加外观模式可以屏蔽这个复杂性,并提供简单的接口。3、维护一个遗留的大型系统,代码不好再维护时,使用外观模式也是不错的选择。看看外观模式的结构图:Facade类定义:可以给高层系统提供简单的接口 class Facade { SubSystemOne one; SubSyste. 阅读全文
摘要:
模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是通过把不变行为搬移到父类,去除子类中重复的代码来体现它的优势。模板方法模式提供了一个很好的代码复用的平台。结构图:AbstractClass定义: abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { Pr 阅读全文