C#-基础加强(1)
2015-08-02 20:20
302 查看
1.背景 ,所在的专业是 软件工程net方向,所以在2013年就开始学习C#语言,那时候就会写个小程序,比如贪吃蛇什 么的,后接触了网站,觉得很有趣,就开始加强基础学习。
2.在2014年寒假在广州打工的时候,对基础加强进行了学习!后总结成了word文档,但十分不方便,就在此补上总 结。
(1)封装:尽量减少代码冗余度,减少重复代码
(2)多态: 一个对象有不同的表现
(3)继承:继承用在多个地方,可以用在抽象类、接口等
关键字为 :(冒号)
(4) 字段:结构体中 构造函数的字段需要全部实现,否则报错
(5)属性:get set 的读写功能,同时可以对字段的属性进行限制比如:性别只有男女
代码示例:
继承的使用往往伴随着多个类的使用,不仅仅是父类和子类的使用,还有实现的功能;
在抽象类和接口中经常使用来实现;
(2) 这里要注意两个关键字 this 和 base:
this 是代表当前类,可以指示当前类,而base代表的是父类,base有几个用处,首先是可以表明父类的引用,其次是在构造函数是 可以直接继承父类的构造函数比如:
最后base 还可以调用父类的方法直接 base.方法名 即可
(3)抽象类 :
关键字是abstruct ,抽象类中的抽象方法不能被实现,只能在子类中实现(override):
子类:
(4)虚方法:关键字virtual ,可以实现,也可在子类中实现,若调用则使用子类中的实现;
抽象类的使用可以减少代码量,同时可以减少不必要的重复,使用起来方便,注意在实现时,也可以使用构造函数的实现(base);
(2)接口:
关键字 :interface,接口定义后不可以实现,只可以在子类中实现方法,同时不能声明接口方法时,不能用修饰符,一般声明为: 返回值 方法名(参数);
接口可以在抽象类中实现,不过抽象类还要在子类中实现,若在子类中实现,则同时抽象类和接口可以同时实现此子类。
(3)as :表示转化 比如person类和student类,在person类中判断是不是student类时
可以写成 person as student 则进行转换,如果是则返回student类是存在的对象 ,不是则student类是null。
is :则可以判断是否是返回bool类型 ,比如bool tmp=person is student;
(4)工厂模式:
抽象类和接口在实现的时候,需要创建子类,这个时候就用到了简单的工厂模式,来造类,同时可以判断条件来造类。
比如:
当然在使用类在使用的时候可以返回,在使用接口的时候,用的比较多。
(5)集合 泛型 字典 的使用
快速读取文件内容:string[] strs= File.ReadLines(@“D:/abc.txt”,Encoding.Default).toArray();
(2) System.IO: 文件夹创建 、删除 和 判断。(Directory类)
文件的创建 、删除 和 判断。(File类)
Path类:比较重要,使用广泛
(3)Stream
文件流操作(1)FileStream读取文件:
文件流操作(2)FileStream创建文件:
StreamReader读取文件(1):
StreamReader存文件(2):s
这两个类使用的时候需要灵活应用,微软已经封装好了一切,使用起来很简单。
(2). 序列化,反序列化,文件监控FileSystemContorl
监控文件夹,代码示例:
序列化和反序列化:
首先引入命名空间:
序列化之前需要标明可序列话:在类上方标明 [Serializable]
代码示例如下:
(3). 正则表达式 (重点但需要常练习)
元字符
. 匹配任意单个字符
* 0或多次
+ 一或多次
? 0或一次
[] 匹配[]中的字符出现一次[0-9] [a-zA-Z]
() 改变正则优先级 (zo)+ zo出现1或多次
| 或 z|food 匹配z或food (z|f)ood 匹配 zood或food
{n} 出现n次
{n,} 至少出现n次,最多不限
{n,m} 至少出现n次,最多出现m次
^ 以谁开头 取反[^>]
$ 以谁结尾
\d 数字
\D
\w 字母 数字 _ 汉字
\w
\s 空白
\S
Regex.IsMatch 字符串匹配
Regex.Match 字符串提取
Regex.Matches 提取多个匹配结果
Regex.Replace 正则替换 分组替换
Match
MatchCollection
RegexOptions
当行模式 Single line 让正则表达式的.能匹配到\n
多行模式 Multiline ^$ 匹配每一行的内容
(2) 匹配字符串
1. 将网页上的文章获得下来
参照下面方法:
2.流下载图片
(3) 总结
System.IO多加练习,加强记忆。
注意这两个doc.save(); |doc.load(); 方法来保存xml和读取xml的内容。
(2) 枚举
关键字enum
声明后,直接可以通过 枚举名.内容 来取得值。
(3) 结构体
声明 struct 结构名 ,相对类来说和类同级,没有无参的构造函数,给字段传参时,需要将所有的字段传参,可用new关键字,也可不用。
类库的使用,在拓展应用时,用处方便,写好后,可以直接调用!
(2)程序集
(3)反射
Assembly
(4)采集程序
复习IO和Regex(正则表达式)的使用
当应用程序开启后,只有一条UI线程(主线程)。
(2) 多线程
多线程的使用涉及到委托的使用,所以在要将委托复习和巩固。
多线程里要将执行的代码程序封装成方法,将方法名给子线程,然后执行,可以有参数,也可以没有参数。
(3)线程Lock
给在线程中执行的代码加Lock后,使得该方法在被多个子线程调用的时候,cpu分配上不冲突。
(4)Socket 网络编程
Socket 编程(套接字),在这里只学习了流式/tcp的使用。首先是命名空间
在声明的时候,如下:
下面将循环进行监听客户端的连接,需要在子线程中进行,否则会阻塞主线程
接受字节数组,在接收的时候,需要在子线程中进行,否则会阻塞UI线程
最好用循环来使用,否则只能接收一条信息
2.在2014年寒假在广州打工的时候,对基础加强进行了学习!后总结成了word文档,但十分不方便,就在此补上总 结。
3.面向对象
面向对象:(1)封装:尽量减少代码冗余度,减少重复代码
(2)多态: 一个对象有不同的表现
(3)继承:继承用在多个地方,可以用在抽象类、接口等
关键字为 :(冒号)
(4) 字段:结构体中 构造函数的字段需要全部实现,否则报错
(5)属性:get set 的读写功能,同时可以对字段的属性进行限制比如:性别只有男女
代码示例:
private string name; public string Name { get{return name;} set{name=value;} } 不过现在有更简单的实现: private string name{get;set}
4.继承,抽象类
(1)继承:继承的使用往往伴随着多个类的使用,不仅仅是父类和子类的使用,还有实现的功能;
在抽象类和接口中经常使用来实现;
(2) 这里要注意两个关键字 this 和 base:
this 是代表当前类,可以指示当前类,而base代表的是父类,base有几个用处,首先是可以表明父类的引用,其次是在构造函数是 可以直接继承父类的构造函数比如:
最后base 还可以调用父类的方法直接 base.方法名 即可
(3)抽象类 :
关键字是abstruct ,抽象类中的抽象方法不能被实现,只能在子类中实现(override):
子类:
classSub : Result { public Sub(int numA, int numB):base(numA,numB) { } public override int getResult() { return base.NumA - base.NumB; }
(4)虚方法:关键字virtual ,可以实现,也可在子类中实现,若调用则使用子类中的实现;
5.接口,抽象类
(1)抽象类:抽象类的使用可以减少代码量,同时可以减少不必要的重复,使用起来方便,注意在实现时,也可以使用构造函数的实现(base);
(2)接口:
关键字 :interface,接口定义后不可以实现,只可以在子类中实现方法,同时不能声明接口方法时,不能用修饰符,一般声明为: 返回值 方法名(参数);
接口可以在抽象类中实现,不过抽象类还要在子类中实现,若在子类中实现,则同时抽象类和接口可以同时实现此子类。
(3)as :表示转化 比如person类和student类,在person类中判断是不是student类时
可以写成 person as student 则进行转换,如果是则返回student类是存在的对象 ,不是则student类是null。
is :则可以判断是否是返回bool类型 ,比如bool tmp=person is student;
(4)工厂模式:
抽象类和接口在实现的时候,需要创建子类,这个时候就用到了简单的工厂模式,来造类,同时可以判断条件来造类。
比如:
class Fectory { public static ResultCreateInstence(string type,int numA,int numB) { Result r = null; switch (type) { case "+": r = new Add(numA, numB); break; case "-": r = new Sub(numA, numB); break; default: throw new Exception("符号不对"); break; } return r; } }
当然在使用类在使用的时候可以返回,在使用接口的时候,用的比较多。
(5)集合 泛型 字典 的使用
6.System.IO
(1) File类快速读取文件内容:string[] strs= File.ReadLines(@“D:/abc.txt”,Encoding.Default).toArray();
(2) System.IO: 文件夹创建 、删除 和 判断。(Directory类)
文件的创建 、删除 和 判断。(File类)
Path类:比较重要,使用广泛
(3)Stream
文件流操作(1)FileStream读取文件:
Using(FileStrem fs=newFileStream(@“D:/abxc.txt”,FileMode.Open)) { Byte[] buffer=new byte[1024]; Int n; While((n=fs.Read(buffer,0,1024)))>0) { Console.WriteLine(Encoding.Default.getString(buffer,0,n)); } } Using(FileStream fs=File.OpenRead(@“D:/abc.txt”)) { //同上 }
文件流操作(2)FileStream创建文件:
string str=”创建文件内容”; Using(FileStream fs=new FileStream(@”D:/abc.txt”,FileMode.Open)) { byte[] buffer=Encoding.Default.GetBytes(str); fs.write(buffer,0,buffer.Lenth); } Using(FileStreamfs=File.OpenWrite(@”D:/abc.txt”)) { //同上 }
7.StreamReader/Writer/序列化
(1). StreamReader StreamWriterStreamReader读取文件(1):
Using(FileStream fs=new FileStream(@”D:/abc.txt”,FileMode.OPen)) { Using(StreamReader sr=new StreamReader(fs)) { sr.Read(); } } Using(StreamReader sr=newStreamReader(@“D:abc.txt”)) { String line; While((line=sr.read())!=null) { Console.writeLine(line); } }
StreamReader存文件(2):s
Using(FileStream fs=new FileStream(@”D:/abc.txt”,FileMode.Create)) { Using(StreamWriter sr=new StreamWriter(fs)) { sr.write(); } }
这两个类使用的时候需要灵活应用,微软已经封装好了一切,使用起来很简单。
(2). 序列化,反序列化,文件监控FileSystemContorl
监控文件夹,代码示例:
//夸线程操作 Control.CheckForIllegalCrossThreadCalls=false; FileSystemWatcher fsw = newFileSystemWatcher(); fsw.Path = @"D:\"; fsw.Filter = "*.txt"; fsw.IncludeSubdirectories = true; fsw.Created += fsw_Created; fsw.EnableRaisingEvents = true; } void fsw_Created(object sender,FileSystemEventArgs e) { listBox1.Items.Add(e.Name +"文件夹监控"+e.GetType()); }
序列化和反序列化:
首先引入命名空间:
usingSystem.Runtime.Serialization.Formatters.Binary;
序列化之前需要标明可序列话:在类上方标明 [Serializable]
代码示例如下:
private static void Deserialize() { using (FileStream fs = newFileStream(@"D:\abc.txt", FileMode.Open)) { BinaryFormatter bf = newBinaryFormatter(); student bfs =bf.Deserialize(fs) as student; if (bfs != null) { bfs.say(); } } } private static void Serialize(students) { using (FileStream fs = newFileStream(@"D:\abc.txt", FileMode.Create)) { BinaryFormatter bf = newBinaryFormatter(); bf.Serialize(fs, s); } }
(3). 正则表达式 (重点但需要常练习)
元字符
. 匹配任意单个字符
* 0或多次
+ 一或多次
? 0或一次
[] 匹配[]中的字符出现一次[0-9] [a-zA-Z]
() 改变正则优先级 (zo)+ zo出现1或多次
| 或 z|food 匹配z或food (z|f)ood 匹配 zood或food
{n} 出现n次
{n,} 至少出现n次,最多不限
{n,m} 至少出现n次,最多出现m次
^ 以谁开头 取反[^>]
$ 以谁结尾
\d 数字
\D
\w 字母 数字 _ 汉字
\w
\s 空白
\S
Regex.IsMatch 字符串匹配
Regex.Match 字符串提取
Regex.Matches 提取多个匹配结果
Regex.Replace 正则替换 分组替换
Match
MatchCollection
RegexOptions
当行模式 Single line 让正则表达式的.能匹配到\n
多行模式 Multiline ^$ 匹配每一行的内容
8.正则表达式,网络爬取
(1) 复习(2) 匹配字符串
1. 将网页上的文章获得下来
参照下面方法:
private static void RegexString() { //根据流来提取字符串 //爬取网页上的文字,并输出和写入txt文件 WebClient wc = new WebClient(); Stream stream = wc.OpenRead(@"http://localhost:51654/网络爬虫_百度百科.htm"); using (StreamReader sr = new StreamReader(stream)) { using (StreamWriter sw = newStreamWriter(@"D:/yuan/网络爬虫.txt")) { string content =sr.ReadToEnd(); MatchCollection matchs =Regex.Matches(content, @"<divclass=""para"">(?<body>.+?)</div>",RegexOptions.Multiline); foreach (Match match inmatchs) { string regexStr =match.Groups["body"].Value; regexStr =Regex.Replace(regexStr, @"<atarget=""_blank"".+>(.+?)</a>","$1"); regexStr =Regex.Replace(regexStr, @"<img class=.+>", ""); regexStr =Regex.Replace(regexStr, @"<div class=.+>", ""); sw.WriteLine(regexStr); Console.WriteLine(regexStr); } } }
2.流下载图片
WebClient wc = new WebClient(); Stream stream = wc.OpenRead(@"http://localhost:51654/网络爬虫_百度百科.htm"); using (StreamReader sr= new StreamReader(stream)) { string html = sr.ReadToEnd(); MatchCollection matchs =Regex.Matches(html,@"src=""(?<img>.+?)"">"); foreach (Match match in matchs) { string imgPath="http://localhost:51654/" +match.Groups["img"].Value; string imgName =Path.GetFileName(imgPath); wc.DownloadFile(imgPath,imgName); } }
(3) 总结
System.IO多加练习,加强记忆。
9.Xml的创建和读取
(1) Xml的创建和读取Xmldocument doc=newXmldocument();
注意这两个doc.save(); |doc.load(); 方法来保存xml和读取xml的内容。
(2) 枚举
关键字enum
声明后,直接可以通过 枚举名.内容 来取得值。
(3) 结构体
声明 struct 结构名 ,相对类来说和类同级,没有无参的构造函数,给字段传参时,需要将所有的字段传参,可用new关键字,也可不用。
10.类库和反射
(1)类库的使用类库的使用,在拓展应用时,用处方便,写好后,可以直接调用!
(2)程序集
(3)反射
Assembly
(4)采集程序
复习IO和Regex(正则表达式)的使用
11.多线程
(1)线程当应用程序开启后,只有一条UI线程(主线程)。
(2) 多线程
多线程的使用涉及到委托的使用,所以在要将委托复习和巩固。
多线程里要将执行的代码程序封装成方法,将方法名给子线程,然后执行,可以有参数,也可以没有参数。
Thread thread=new Thread(方法名); thread.isBackGround=true;//设置成后台线程为了让关闭程序后,该线程自动结束而设置。 thread.start();
(3)线程Lock
给在线程中执行的代码加Lock后,使得该方法在被多个子线程调用的时候,cpu分配上不冲突。
(4)Socket 网络编程
Socket 编程(套接字),在这里只学习了流式/tcp的使用。首先是命名空间
Using System.Net.Sockets; Using system.Net;
在声明的时候,如下:
//声明,方式为流式,类型为Tcp Socket connSoc = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //设置IP地址 IPAddress ipaddress =IPAddress.Parse(ComConst.ipAddress); //设置端口号 IPEndPoint ipPoint = newIPEndPoint(ipaddress, ComConst.ipPort); //将IPEndPoint添加到Socket当中 connSoc.Bind(ipPoint); //设置监听数 connSoc.Listen(10); lb_tishi.Text += "服务器启动成功";
下面将循环进行监听客户端的连接,需要在子线程中进行,否则会阻塞主线程
while (userConn) { //Accept()方法返回一个Socket Socket userSoc = connSoc.Accept(); //获得客户端的ip和端口 EndPoint ep=userSoc.RemoteEndPoint; ShowMsg("登陆成功"); } //发送字节数组 userSoc. Send(byte[]buffer);
接受字节数组,在接收的时候,需要在子线程中进行,否则会阻塞UI线程
最好用循环来使用,否则只能接收一条信息
while (userRecv) { byte[] buffer = newbyte[1024]; userSoc.Receive(buffer); string msg = Encoding.UTF8.GetString(buffer); showMsg(msg); }
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- c#调用COM组件
- C#实现把指定数据写入串口
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- C#简单的向量用法实例教程
- C#实现基于链表的内存记事本实例
- C#托管堆对象实例包含内容分析
- C#实现按照指定长度在数字前补0方法小结
- C# 通过 inline-asm 解决嵌入x86汇编