一、综合练习题1:
磁盘上有不同的文件,比如*.txt、.avi、xls文件,要求编写一个控制台程序,用户输入文件全名后,将文件后缀传递到一个方法中,该方法根据后缀返回对应的文件对象。
分析:此练习题用到了类的多态,可以复习抽象类、简单工厂、进程等
1、复习1: 用进程打开指定的文件
//使用进程打开指定的文件
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\tufeiax\Desktop\042.jpg");
Process p = new Process();
p.StartInfo = psi;
p.Start();
2、复习2:抽象类---抽象类一般是想实现多态,但又不确定基类的方法的时候。
语法:基类:abstract class; 基类的抽象方法:abstract+返回值类型,不能有方法体,并且子类必须重写此方法
3、复习3:简单工厂:简单工厂是最普通的C#设计模式,具体实现是,写一个有父类返回值的方法,返回值父类内的对象依据传入参数来决定。最后通过主函数中调用此方法
得到一个父类对象,调用此对象的抽象方法,从而实现多态
二、虚方法需要注意的地方:
1、父类中如果有方法需要让子类重写,则可以将该方法标记为虚方法,访问修饰符后加上virtual;
2、虚方法在父类中必须有实现,哪怕是空实现,两个大括号必须有;
3、虚方法在子类中可以重写(override),也可以不重写
三、抽象类需要注意的地方:
1、访问修饰符后需加上abstract标记;
2、抽象方法不能有任何实现;
3、抽象成员必须包含在抽象类中;
4、子类必须重写(override)该方法;
5、抽象类不能实例化,抽象类的作用就是为了让子类继承
6、抽象类中可以包括抽象成员,也可以包括具体代码的成员;
7、抽象方法不可以是静态的,不能被static修饰。
四、接口
1、接口只能包含方法(属性、事件、索引器其实都是方法)
2、接口中的成员不能有任何实现;
3、接口不能实例化;
4、接口中的成员不能有任何访问修饰符(默认为public)
5、接口的子类必须实现接口中的所有成员;
6、子类实现接口成员时,不需要任何关键字,直接实现即可;
7、接口存在的意义就是为了多态。
五、字符串复习
学习.net就是学习无数个类库怎么用
1、复习string类:字符串操作类,可以看成是可读字符数组,string类的特性是不可变,如果想要改变字符串中的某个字符,需要转成字符数组修改,然后转回string类
比如,string s=“abc”; s=“efg”,s被重新赋值时会重新再堆中开辟一段新空间,原先的abc依然存在,程序结束时,gc自动将其清除
属性:
.Length 获得字符串的个数
string.IsNullOrEmpty 静态方法 判断是否为null或者空字符,返回值是bool类型
.ToCharArray()将字符串类型转成字符数组,返回值是char[]
.ToLower() 转小写,返回一个新的string
.ToUpper() 转大写,返回一个新的string
.Equals(str,StringSplitOption...) 与str比较是否相同,返回bool类型,第二个参数为忽略大小写比较
str.Equals(str2, StringComparison.OrdinalIgnoreCase);
.Contains(char/string) 是否包含字符或字符串,返回bool类型
.IndexOf(char/string,index) 返回第一次出现参数的字符或字符串的索引位置,第二个参数是重载,代表从哪个位置开始查找
.LastIndexOf(char/string,index) 返回最后一个出现字符或字符串的索引位置
.SubString(index,n) 截取字符串,从index位置截取到最后,或者截取n位,返回一个新字符串
..Split(char[]/string[],x) 分割字符串,将字符串内含有char[]或string[]的元素删除,分割成一个字符串数组,返回
str.Split(new char[] { ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);
string.Join(char/string,string[]) 静态方法 将参数1插入参数2的元素当中,并连接起来返回一个新的字符串
.Replace(oldchar/oldstring,newchar/newstring) 将字符串中的参数1替换为参数2,并返回一个新的字符串
2、复习StringBuilder类 :高效字符串操作类
高效的原因是:操作字符串时,拼接字符串不需要重新开辟空间,所以当字符大量被重新赋值时,最好使用StringBuild类操作
它只是字符串拼接的工具,不能使用,拼接完成之后要将其转换成string
创建方法:StringBuilder sb=new StringBuilder()
属性:
sb.Append(string) 追加字符串
sb.ToString() 转成字符串
sb.Insert(index,x) 在sb的索引位置插入x,x可以是很多类型,不过插入之前都会被转成字符串
sb.Replace(oldchar/oldstring,newchar/newstring) 将字符串中的第一个参数替换成第二个参数
案例:使用StringBuilder拼接HTML的table表格
六、集合复习
ArrayList :集合
Hashtable :键值对
以上两个一般不用了,用以下连个代替。因为上面两个赋值和取值过程中会发生大量的装箱和拆箱(值类型---引用对象类型)
List<T> : 泛型集合
Dictionary<TKey,TValue> : 泛型键值对
1、泛型集合
集合初始化:
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
或者
List<int> list = new List<int>();
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
属性:
list.Add() 给集合添加单个元素
list.AddRange() 给集合添加多个元素
list.ToArray() 将集合转成数组,返回固定数据类型的数组
2、泛型键值对
声明方法,例:
Dictionary<char, int> dic = new Dictionary<char, int>();
七、静态和非静态 static
特点:静态类中只能有静态成员,非静态类中的静态函数只能访问静态成员。静态类不能初始化对象(因为静态类不能有构造函数,不能出现访问修饰符)
八、结构与类
***