1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。C#设计模式( 1) 课程内容: 设计模式来源: 亚历山大的建筑模式、 Gamma等人( 1995) 创作的Design Patterns: Elements of Reusable Software。这本书一般被称作Gang of Four或GoF, 开创性的创造了设计模式。也有人说三十六计就是模式。一、 C# 面向对象程序设计复习点击下载, 内容包括: 字段与属性.csusing System;class Accountprivate double balance = 0;/字段public double Balance/属性g
2、et return balance; set balance = value;/*= * 我们能够经过修改get、 set方法达到控制存取的目的。 * 例如: * * 1)只读属性 * public double Balance/属性 * * get return balance; * set * * * 2)读写控制 * public double Balance * * get * * if(Console.ReadLine()=1234) * return balance; * else * return -9999999; * * set * * = */public void Dep
3、osit(double n) this.balance += n; public void WithDraw(double n) this.balance -= n; class Clientpublic static void Main()Account a = new Account();a.Balance = 1000;/ 能够读写属性, 因为属性Balance是public型的/a.balance = 1000;/不能够读写字段, 因为字段balance是private型的a.WithDraw(500);a.Deposit( );Console.WriteLine(a.Balance)
4、;属性、 方法作用范围.csusing System;class Base/* * public 的可访问范围是所有类 * private 的可访问范围是当前类 * protected 的可访问范围是当前类及其子类 */public string name = Tom;private double salary = 1500;protected int age = 20;public virtual void ShowInfo()Console.WriteLine(this.name);/能够, 因为name是 public 型的Console.WriteLine(this.salary);/
5、能够, salary是private型, 在Base类中能够访问Console.WriteLine(this.age);/能够, 因为age是protected型, 在子类中能够访问class Derived : Basepublic override void ShowInfo()Console.WriteLine(this.name);/能够, 因为name是 public 型的/Console.WriteLine(this.salary);/不能够, salary是private型, 超出Base就无法访问Console.WriteLine(this.age);/能够, 因为age是pr
6、otected型, 在子类中能够访问class Clientpublic static void Main()Base b = new Base();Console.WriteLine(b.name);/能够, 因为name是 public 型的/Console.WriteLine(this.salary);/不能够, salary是private型, 超出Base就无法访问/Console.WriteLine(this.age);/不能够, 因为age是protected型, Client不是Base的子类Console.WriteLine(=);b.ShowInfo();Console.W
7、riteLine(=);Derived d = new Derived();d.ShowInfo();一加到一百.csusing System;class SumToHundredpublic static void Main()int sum=0;for(int i=1; i=100; i+)sum += i;Console.WriteLine(sum);使用接口排序(1).csusing System;using System.Collections; public class Person : IComparablepublic int ID;public string Rank;pub
8、lic Person(int id, string rank) this.ID=id; this.Rank = rank; #region IComparable Members/* * IComparable 接口只有一个方法: CompareTo。CompareTo方法 * 只接收一个object类型的参数, 这意味着它能够接收任何类 * 型的数据( object是所有类的父类) , 这个方法会返回一 * 整型数值, 含义如下: * * 1) 小于零, 当前实例( this) 小于obj对象 * 2) 等于零, 当前实例( this) 等于obj对象 * 3) 大于零, 当前实例( thi
9、s) 大于obj对象 * * Int32,Int16.,String,Decimal等数据类型都已经实现了IComparable接口 */public int CompareTo(object obj)Person p = (Person)obj;return this.ID.CompareTo(p.ID);#endregionclass SortArrayList static void Main(string args) ArrayList list = new ArrayList();list.Add(new Person(6, 排长);list.Add(new Person(3, 团长
10、);list.Add(new Person(4, 司令);list.Add(new Person(5, 旅长);list.Add(new Person(7, 连长);list.Add(new Person(1, 军长);list.Add(new Person(2, 营长);list.Add(new Person(8, 师长);list.Sort();Console.WriteLine(After Sorting);foreach (Person person in list) Console.WriteLine(ID: + person.ID.ToString() + , Rank: + pe
11、rson.Rank);使用接口排序(2).csusing System;using System.Collections; public enum enuSortOrderIDAsc, IDDesc, RankAsc, RankDescpublic class Person : IComparablepublic static enuSortOrder intSortOrder = enuSortOrder.IDAsc;public int ID;public string Rank;public Person(int id, string rank) this.ID=id; this.Ran
12、k = rank; #region IComparable Members/* * IComparable 接口只有一个方法: CompareTo。CompareTo方法 * 只接收一个object类型的参数, 这意味着它能够接收任何类 * 型的数据( object是所有类的父类) , 这个方法会返回一 * 整型数值, 含义如下: * * 1) 小于零, 当前实例( this) 小于obj对象 * 2) 等于零, 当前实例( this) 等于obj对象 * 3) 大于零, 当前实例( this) 大于obj对象 * * Int32,Int16.,String,Decimal等数据类型都已经实现
13、了IComparable接口 */public int CompareTo(object obj)Person p = (Person)obj;switch (int)intSortOrder)case (int)enuSortOrder.IDAsc:return this.ID.CompareTo(p.ID);case (int)enuSortOrder.IDDesc:return p.ID.CompareTo(this.ID);case (int)enuSortOrder.RankAsc:return RankCompare(this.Rank, p.Rank);case (int)enu
14、SortOrder.RankDesc:return RankCompare(p.Rank, this.Rank);default:return this.ID.CompareTo(p.ID);private int RankCompare(string rank1, string rank2)int intRank1 = ConvertRankToInt(rank1);int intRank2 = ConvertRankToInt(rank2);if(intRank1 intRank2)return -1;else if(intRank1 = intRank2)return 0;elseret
15、urn 1;private int ConvertRankToInt(string rank)if(rank = 司令)return 8;else if(rank = 军长)return 7;else if(rank = 师长)return 6;else if(rank = 旅长)return 5;else if(rank = 团长)return 4;else if(rank = 营长)return 3;else if(rank = 连长)return 2;elsereturn 1;#endregionclass SortArrayList static void Main(string ar
16、gs) ArrayList list = new ArrayList();list.Add(new Person(6, 排长);list.Add(new Person(3, 团长);list.Add(new Person(4, 司令);list.Add(new Person(5, 旅长);list.Add(new Person(7, 连长);list.Add(new Person(1, 军长);list.Add(new Person(2, 营长);list.Add(new Person(8, 师长);list.Sort();Console.WriteLine(Sort By ID Asc:);
17、foreach (Person person in list) Console.WriteLine(ID: + person.ID.ToString() + , Rank: + person.Rank);Console.WriteLine(-);Console.WriteLine(Sort By ID Desc:);Person.intSortOrder = enuSortOrder.IDDesc;list.Sort();foreach (Person person in list) Console.WriteLine(ID: + person.ID.ToString() + , Rank:
18、+ person.Rank);Console.WriteLine(-);Console.WriteLine(Sort By Rank Asc:);Person.intSortOrder = enuSortOrder.RankAsc;list.Sort();foreach (Person person in list) Console.WriteLine(ID: + person.ID.ToString() + , Rank: + person.Rank);Console.WriteLine(-);Console.WriteLine(Sort By Rank Desc:);Person.intS
19、ortOrder = enuSortOrder.RankDesc;list.Sort();foreach (Person person in list) Console.WriteLine(ID: + person.ID.ToString() + , Rank: + person.Rank);求质数.csusing System;class Factorpublic static void Main()for(int i=1; i=100; i+)if(IsPrime(i) Console.WriteLine(i);public static bool IsPrime(int n)for(in
20、t i=2; i=Math.Sqrt(n); i+)if(n%i = 0)return false;return true;冒泡法排序.csusing System;class ArraySortpublic static void Main()int d = 10,15,21,43,17,98,2,74,63,10;int temp;/冒泡法排序for(int i=0; id.Length; i+)for(int j=i+1; jd.Length; j+)if(didj)temp = di;di=dj;dj=temp;/输出排序结果foreach(int i in d)Console.Wri
21、te(0, , i);九九表.csusing System;public class JiuJiuBiaopublic static void Main(string args)int i,j;for(i=1; i10; i+)for(j=1; j10; j+)Console.Write(0:D1*1:D1=2,2 , i, j, i*j);Console.WriteLine();Console.ReadLine();静态与非静态.csusing System;class StaticHellopublic static void SayHello() Console.WriteLine(St
22、atic Hello); class NonStaticHellopublic void SayHello() Console.WriteLine(Non Static Hello); class Clientpublic static void Main()/静态方法调用应当使用 ”类名.方法”StaticHello.SayHello();/非静态方法调用应当使用 ”实例名称.方法”NonStaticHello h = new NonStaticHello();h.SayHello();构造函数.csusing System;public class Personpublic string
23、name = ;public int age = 0;/默认构造函数public Person()/构造函数重载(1)public Person(int Age)this.age = Age;/构造函数重载(2)public Person(int Age, string Name)this.age = Age;this.name = Name;public void ShowInfo()Console.WriteLine(The name is : + name);Console.WriteLine(The age is: + age);class Clientpublic static vo
24、id Main()Person p1 = new Person();p1.ShowInfo();Console.WriteLine(=);Person p2 = new Person(30);p2.ShowInfo();Console.WriteLine(=);Person p3 = new Person(30, Tom);p3.ShowInfo();方法重载.csusing System;class Clientpublic static void Main()/重载是指方法名相同, 方法的签名不同Console.WriteLine(Add(10,5);Console.WriteLine(A
25、dd(10,5);public static string Add(string a, string b)return a + add + b;public static int Add(int a, int b)return a+b;多态性.csusing System;class Carpublic virtual void Drive() Console.WriteLine(Drive Car); class Truck : Carpublic override void Drive() Console.WriteLine(Drive Truck);class Clientpublic
26、static void Main()Car c = new Truck();c.Drive();/多态性决定着将调用Truck的Drive方法递归求阶乘.csusing System;class Factorpublic static void Main()for(int i=1; i=10; i+)Console.WriteLine(0 的阶乘是 1,i, Factorial(i);public static long Factorial(long n)if(n = 1)return 1;elsereturn n * Factorial(n-1);打印三角形.csusing System;p
27、ublic class Hellopublic static void Main()Console.Write(请输入行数:);int lines = int.Parse(Console.ReadLine();Console.WriteLine();for(int i=1; i=lines ; i+)for(int k=1; k= lines-i; k+)Console.Write( );for(int j=1; j=i*2+1; j+)Console.Write(*);Console.WriteLine();Console.ReadLine();传值调用与引用调用.csusing Syste
28、m;class MethodCallpublic static void Main() /* * 参数类型分为 in, ref, out 三种, 默认为 in。 * in 类型在子方法中修改了对应变量后, 主方法中的值不会发生改变。 * ref 类型在子方法中修改了对应变量后, 主方法中的值也会发生改变。 * out 主方法中对应的变量不需要初始化。 * */int a = 3, b = 4, c;Console.WriteLine(Before Method Call : a = 0, b = 1, c 未赋值, a, b);AMethod(a, ref b, out c);Console.
29、WriteLine(After Method Call : a = 0, b = 1, c = 2, a, b, c);public static void AMethod(int x, ref int y, out int z)x = 7;y = 8;z = 9;二、 设计模式举例在设计模式中有一种模式叫Builder模式, 其原理如下: 我们能够将Builder理解成电饭锅, 给这个Builder放进去米和水, 经过Builder的Build后, 我们就能够取出香喷喷的米饭了。C#中有一个类叫StringBuilder, 输入必要的信息后, 就能够取出对应的String。其使用方法如下:
30、usingSystem;usingSystem.Text;classExampublicstaticvoidMain()StringBuildersb=newStringBuilder();sb.Append(a,2);sb.Append(b,3);sb.Append(c,4);Console.WriteLine(sb.ToString();/打印出aabbbccccsb.Remove(0,sb.Length);/清除sb中的所有信息程序执行结果为: aabbbcccc请使用StringBuilder对以下打印三角型的程序进行改写, 写出新程序。usingSystem;publicclassE
31、xampublicstaticvoidMain()Console.Write(请输入行数:);intlines=int.Parse(Console.ReadLine();Console.WriteLine();for(inti=1;i=lines;i+)for(intk=1;k=lines-i;k+)Console.Write();for(intj=1;j=i*2-1;j+)Console.Write(*);Console.WriteLine();答: usingSystem;usingSystem.Text;classExampublicstaticvoidMain()Console.Wri
32、te(请输入行数:);intlines=int.Parse(Console.ReadLine();Console.WriteLine();StringBuildersb=newStringBuilder();for(inti=1;i=lines;i+)sb.Append(,lines-i);sb.Append(*,i*2-1);Console.WriteLine(sb.ToString();sb.Remove(0,sb.Length);三、 先有鸡还是先有蛋? 到底是先有鸡还是先有蛋? 看下面的代码: usingSystem;classClientpublicstaticvoidMain()B
33、aseb=newBase();Derivedd=newDerived();b.d=d;Console.WriteLine(b.d.m);classBasepublicintn=9;publicDerivedd;classDerived:Basepublicintm=10;Derived继承自Base, 能够说没有Base就没有Derived, 可Base里面有一个成员是Derived类型。到底是先有鸡还是先有蛋? 这个程序能够正常编译执行并打印结果10。四、 大瓶子套小瓶子还是小瓶子套大瓶子? 另外一个例子: usingSystem;classClientpublicstaticvoidMai
34、n()Aa=newA();Bb=newB();a.b=b;b.a=a;classApublicBb;classBpublicAa;上面的代码似乎描述了a包含b, b包含a的关系, 到底是大瓶子套小瓶子还是小瓶子套大瓶子呢? 五、 .net本质关于先有鸡还是先有蛋的程序, 系统运行后, 内存结构如下: 由图中能够看出, 根本不存在鸡与蛋的问题, 而是型与值的问题以及指针引用的问题。关于大瓶子套小瓶子还是小瓶子套大瓶子问题, 系统运行后, 内存结构如下: 由于是指针引用, 因此也无所谓大瓶子还是小瓶子了。其实上述问题的一个关键点是: 值类型和引用类型的问题。 引用类型其实有2个部分: 1个是她的”引用柄”, 它是引用的外在表现。第2个是对象, 是我们用”引用类型”时真正想要的东西( 对象) 。它是引用的内在实体。 当我们用”引用类型”时: 是经过”引用柄”来引用”对象”。我们真正引用到的是内在的对象, 而不是外在的”引用柄”。关于更多内容能够参考.NET本质论 第1卷: 公共语言运行库。