那些年,我还在学习C# 学习笔记续
程序员文章站
2023-12-01 21:18:16
那些年,我还在学习c#续 那些年学习c#,就是对c#相关的一些知识有一个了解,等到要用时才不会找不到方向,比如说扩展方法,开始时怎么觉得没有用,后来了解到asp.net m...
那些年,我还在学习c#续
那些年学习c#,就是对c#相关的一些知识有一个了解,等到要用时才不会找不到方向,比如说扩展方法,开始时怎么觉得没有用,后来了解到asp.net mvc,它可以用来扩展html类,比如做一个分页的方法;所以对一门语言了解宽一些是没有坏处的;c#中还有一些在上文中没有提到的,如:读取文件、网络(socket)编程、序列化等,他们都是非常重要的啊,下面再来看一看吧!
一、读取文件
在文件读取学习时,一般都会提到字节流与字符流,前都按字节读取,后都按字符读取;我们通过filestream、streamwriter、streamreader、binarywriter、binaryreader来完成,在system.io空间中提供了他们的使用,读取文件操作不仅再桌面程序中有用,而且在asp.net web程序中也很有用,通过读取文件可以生成静态的网页,一些不需要交互的页面,都可以做成静态的页面,比如新闻。下面来看一下具体是怎么用他们的吧:
1、 streamwriter、streamreader的使用:
/// <summary>
/// writer通过路径来得读取文件,并写入数据
/// </summary>
/// <param name="path">路径</param>
public void fileoporcreatewriter(string path)
{
//打开或创建一个文件
using (filestream fs = new filestream(path, filemode.openorcreate))
{
//向打开文件中写入数据
using (streamwriter sw = new streamwriter(fs, encoding.utf8))
{
//写入数据
sw.writeline("my name is whc");
sw.flush();
}
}
}
/// <summary>
/// reader读取文件
/// </summary>
/// <param name="path">路径</param>
public void fileoporcreatereader(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (streamreader sr = new streamreader(fs, encoding.utf8))
{
console.writeline(sr.readline());
}
}
}
2、 binarywriter、binaryreader的使用
/// <summary>
/// writer二进制的写入方法
/// </summary>
/// <param name="path"></param>
public void fileoporcreatebinarywriter(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (binarywriter bw = new binarywriter(fs, encoding.utf8))
{
string mystr = "this is a good boy 中国!!!";
//得到字符串的二制代码
byte[] bt = new utf8encoding().getbytes(mystr); //utf8encoding().getbytes(mystr);
console.writeline("二进制为:" + bt + ",大小:" + bt.length);
bw.write(bt);
bw.flush();
}
}
}
/// <summary>
/// binaryreader读取数据
/// </summary>
/// <param name="path"></param>
public void fileoporcreatebinaryreader(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (binaryreader br = new binaryreader(fs, encoding.utf8))
{
char[] mystr = new char[1024];
//得到字符串的二制代码
byte[] bt = br.readbytes(1024);
//解码
decoder d = new utf8encoding().getdecoder();
d.getchars(bt, 0, bt.length, mystr, 0);
console.writeline(mystr);
}
}
}
3、 文件的其它操作
/// <summary>
/// 删出文件
/// </summary>
/// <param name="path"></param>
public void deletefile(string path)
{
try
{
file.delete(path);
}
catch (exception e)
{
console.writeline("it is errors");
}
}
/// <summary>
/// 显示目录下的文件
/// </summary>
/// <param name="path"></param>
public void getdirectorinfo(string path)
{
//得到目录下的目录
string[] filenamelist = directory.getdirectories(path);
for (int i = 0; i < filenamelist.length; i++)
{
console.writeline(filenamelist[i]);
fileinfo fi = new fileinfo(filenamelist[i]);
console.writeline(" 文件名:" + fi.fullname);
console.writeline(" 文件创建的时间:" + fi.creationtime);
console.writeline(" 最后访问时间:" + fi.lastaccesstime);
}
}
二、 序列化
在c#中序列化又叫做串行化,是.net平台运行环境支持用户定义类型的流化机制,其作用是以某种形势存储让对象持久化,或是在网络中传输,可以存放在文件,或是数据库中,应用程序下次启动时可以读取上一次保存的态状,以便在不同的就用程序*享数据,其主要作用如下:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的appdomain或进程之间传递数据
3、在分布式应用系统中传递数据
.net提供了三种方式来序列化一个对象,主要有:
1、二进制方式,binaryformatter,可以使用iformatter接口来使用它 using system.runtime.serialization.formatters.binary;
将对象序列化为二进制,代码如下:
/// <summary>
/// 序列化一个对象到内存中
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private byte[] serializable(serializableobj obj)
{
iformatter ifmt = new binaryformatter();
using (memorystream ms = new memorystream())
{
ifmt.serialize(ms, obj);
return ms.toarray();
}
}
2、soapformatter using system.runtime.serialization.formatters.soap;iformatter接口来使用它 没有时,可添加对应的程序集
soap方式是一种简单对象访问形式,是一种轻量的、简单的、基于xml的协议,它被设计成在web上交换结构化的和固化的信息。
soap 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(http),简单邮件传输协议(smtp),多用途网际邮件扩充协议(mime)。
它还支持从消息系统到远程过程调用(rpc)等大量的应用程序。soap使用基于xml的数据结构和超文本传输协议(http)的组合定义了一个标准的方法来使用internet上各种不同操作环境中的分布式对象。)
代码如下:
/// <summary>
/// 反序列化一个内存中的对象
/// </summary>
/// <param name="bytedata"></param>
/// <returns></returns>
private serializableobj deserializable(byte[] bytedata)
{
iformatter ifmt = new soapformatter();
using (memorystream ms = new memorystream(bytedata))
{
return (serializableobj)ifmt.deserialize(ms);
}
}
3、xml序列化 using system.xml.serialization;.xmlseralizer要求类有个默认的构造器
xmlserializer xsl = new xmlserializer(typeof(serializableobj));
using (memorystream ms = new memorystream(bytedata))
{
return (serializableobj)xsl.deserialize(ms);
}
我们分别可以通过这几种方式完成需要的序列化
同时,我们在指定类的时候也可以通过特性说明哪些需要序列化,哪些不需要序列化,如下:
[serializable]//需要序列化
class serializableobj
{
[nonserialized] //不需要序列化
public int orderid;
public string ordername;
public serializableobj() { }
public serializableobj(int orderid, string ordername)
{
this.orderid = orderid;
this.ordername = ordername;
}
public override string tostring()
{
return "orderid:" + orderid + "\t\nordername:" + ordername;
}
}
4、自定义序列化
自定义序列化可以使用iserializable接口,并且实现getobjectdata()方法,就可以自定义序列化的方式,如下:
class cumstomserializable:iserializable
{
public void getobjectdata(serializationinfo info, streamingcontext context)
{
throw new notimplementedexception();
}
}
三、 linq的学习
linq是c#3.0的新添加的一个特性,为了使得查询更容易,同时可以对集合进行操作,使得对数据库与集合的操作更加简单,如:linq to sql、linq to dataset等,linq查询表达式是以"from"开始,以一个"select子句"或是"group by子句"结束.
1、linq中的关键字
·from:指定数据源以 用来迭代数据源的变量(范围变量)
·where:过滤查询结果
·select:指定查询结果中的项
·group:通过某一关键字,对相关的值进行聚合
·into:存储聚合中的结果,或连接到一个临时变量
·orderby:查询结果按某一关键字升序或降序排列
·join:通过一个关键字,对两个数据源进行连接
·let:创建一个临时变量,来表示子查询的结果
2、system.linq.enumernable类的方法
·aggregate():对序列中的每一项应用同一个函数
·average():返回序列中每一项的平均值
·count():返回序列的总项数
·distinct():返回序列中不同的项
·max():返回序列中的最大值
·min():返回序列中的最小值
·select():返回序列中某些项或属性
·single():返回序列中的某一个单一值
·skip():跳过序列中指定数目的项并返回剩下的元素
·take():返回序列中的指数目的元素
·where():过滤序列中的元素
·orderby():返回发某一特定字段升序排序的结果
·orderbydescending():返回按某一特定字段降序排序的查询结果
·thenby():返回使用某一额外字段排序的查询结果
·thenbydescending():返回使用霜一额外字段进行降序排序的查询结果
·singleordefault():选择单独一行或默认的实例
·skip():允许跳过指定数量的记录
·take():允许获得一定数量的记录
4、 示例:
list<string> linqlist = new list<string>() {
"demo1","demo2","demo3"
};
//lq是一个范围变量,where是条件,看起来很像sql语句
ienumerable<string> results = from lq in linqlist where lq.contains("2") select lq;
foreach (var result in results)
{
system.console.writeline(result.tostring());
}
结果:demo2
linq查询被翻译时会调用system.linq.enumernable类的方法,将linq语句翻译成查询语句与查询方法:var demo = linqlist.where(m => m.contains("2")).select(m => m); 结果同上
总结:
那些年学习c#,主要是对它的一些基础知识的学习,同时也是在asp.net web开发时更好的使用c#进行编程,此文以回忆那些年学习c#的日子。
那些年学习c#,就是对c#相关的一些知识有一个了解,等到要用时才不会找不到方向,比如说扩展方法,开始时怎么觉得没有用,后来了解到asp.net mvc,它可以用来扩展html类,比如做一个分页的方法;所以对一门语言了解宽一些是没有坏处的;c#中还有一些在上文中没有提到的,如:读取文件、网络(socket)编程、序列化等,他们都是非常重要的啊,下面再来看一看吧!
一、读取文件
在文件读取学习时,一般都会提到字节流与字符流,前都按字节读取,后都按字符读取;我们通过filestream、streamwriter、streamreader、binarywriter、binaryreader来完成,在system.io空间中提供了他们的使用,读取文件操作不仅再桌面程序中有用,而且在asp.net web程序中也很有用,通过读取文件可以生成静态的网页,一些不需要交互的页面,都可以做成静态的页面,比如新闻。下面来看一下具体是怎么用他们的吧:
1、 streamwriter、streamreader的使用:
复制代码 代码如下:
/// <summary>
/// writer通过路径来得读取文件,并写入数据
/// </summary>
/// <param name="path">路径</param>
public void fileoporcreatewriter(string path)
{
//打开或创建一个文件
using (filestream fs = new filestream(path, filemode.openorcreate))
{
//向打开文件中写入数据
using (streamwriter sw = new streamwriter(fs, encoding.utf8))
{
//写入数据
sw.writeline("my name is whc");
sw.flush();
}
}
}
/// <summary>
/// reader读取文件
/// </summary>
/// <param name="path">路径</param>
public void fileoporcreatereader(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (streamreader sr = new streamreader(fs, encoding.utf8))
{
console.writeline(sr.readline());
}
}
}
2、 binarywriter、binaryreader的使用
复制代码 代码如下:
/// <summary>
/// writer二进制的写入方法
/// </summary>
/// <param name="path"></param>
public void fileoporcreatebinarywriter(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (binarywriter bw = new binarywriter(fs, encoding.utf8))
{
string mystr = "this is a good boy 中国!!!";
//得到字符串的二制代码
byte[] bt = new utf8encoding().getbytes(mystr); //utf8encoding().getbytes(mystr);
console.writeline("二进制为:" + bt + ",大小:" + bt.length);
bw.write(bt);
bw.flush();
}
}
}
/// <summary>
/// binaryreader读取数据
/// </summary>
/// <param name="path"></param>
public void fileoporcreatebinaryreader(string path)
{
using (filestream fs = new filestream(path, filemode.openorcreate))
{
using (binaryreader br = new binaryreader(fs, encoding.utf8))
{
char[] mystr = new char[1024];
//得到字符串的二制代码
byte[] bt = br.readbytes(1024);
//解码
decoder d = new utf8encoding().getdecoder();
d.getchars(bt, 0, bt.length, mystr, 0);
console.writeline(mystr);
}
}
}
3、 文件的其它操作
复制代码 代码如下:
/// <summary>
/// 删出文件
/// </summary>
/// <param name="path"></param>
public void deletefile(string path)
{
try
{
file.delete(path);
}
catch (exception e)
{
console.writeline("it is errors");
}
}
/// <summary>
/// 显示目录下的文件
/// </summary>
/// <param name="path"></param>
public void getdirectorinfo(string path)
{
//得到目录下的目录
string[] filenamelist = directory.getdirectories(path);
for (int i = 0; i < filenamelist.length; i++)
{
console.writeline(filenamelist[i]);
fileinfo fi = new fileinfo(filenamelist[i]);
console.writeline(" 文件名:" + fi.fullname);
console.writeline(" 文件创建的时间:" + fi.creationtime);
console.writeline(" 最后访问时间:" + fi.lastaccesstime);
}
}
二、 序列化
在c#中序列化又叫做串行化,是.net平台运行环境支持用户定义类型的流化机制,其作用是以某种形势存储让对象持久化,或是在网络中传输,可以存放在文件,或是数据库中,应用程序下次启动时可以读取上一次保存的态状,以便在不同的就用程序*享数据,其主要作用如下:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的appdomain或进程之间传递数据
3、在分布式应用系统中传递数据
.net提供了三种方式来序列化一个对象,主要有:
1、二进制方式,binaryformatter,可以使用iformatter接口来使用它 using system.runtime.serialization.formatters.binary;
将对象序列化为二进制,代码如下:
复制代码 代码如下:
/// <summary>
/// 序列化一个对象到内存中
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private byte[] serializable(serializableobj obj)
{
iformatter ifmt = new binaryformatter();
using (memorystream ms = new memorystream())
{
ifmt.serialize(ms, obj);
return ms.toarray();
}
}
2、soapformatter using system.runtime.serialization.formatters.soap;iformatter接口来使用它 没有时,可添加对应的程序集
soap方式是一种简单对象访问形式,是一种轻量的、简单的、基于xml的协议,它被设计成在web上交换结构化的和固化的信息。
soap 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(http),简单邮件传输协议(smtp),多用途网际邮件扩充协议(mime)。
它还支持从消息系统到远程过程调用(rpc)等大量的应用程序。soap使用基于xml的数据结构和超文本传输协议(http)的组合定义了一个标准的方法来使用internet上各种不同操作环境中的分布式对象。)
代码如下:
复制代码 代码如下:
/// <summary>
/// 反序列化一个内存中的对象
/// </summary>
/// <param name="bytedata"></param>
/// <returns></returns>
private serializableobj deserializable(byte[] bytedata)
{
iformatter ifmt = new soapformatter();
using (memorystream ms = new memorystream(bytedata))
{
return (serializableobj)ifmt.deserialize(ms);
}
}
3、xml序列化 using system.xml.serialization;.xmlseralizer要求类有个默认的构造器
复制代码 代码如下:
xmlserializer xsl = new xmlserializer(typeof(serializableobj));
using (memorystream ms = new memorystream(bytedata))
{
return (serializableobj)xsl.deserialize(ms);
}
我们分别可以通过这几种方式完成需要的序列化
同时,我们在指定类的时候也可以通过特性说明哪些需要序列化,哪些不需要序列化,如下:
复制代码 代码如下:
[serializable]//需要序列化
class serializableobj
{
[nonserialized] //不需要序列化
public int orderid;
public string ordername;
public serializableobj() { }
public serializableobj(int orderid, string ordername)
{
this.orderid = orderid;
this.ordername = ordername;
}
public override string tostring()
{
return "orderid:" + orderid + "\t\nordername:" + ordername;
}
}
4、自定义序列化
自定义序列化可以使用iserializable接口,并且实现getobjectdata()方法,就可以自定义序列化的方式,如下:
复制代码 代码如下:
class cumstomserializable:iserializable
{
public void getobjectdata(serializationinfo info, streamingcontext context)
{
throw new notimplementedexception();
}
}
三、 linq的学习
linq是c#3.0的新添加的一个特性,为了使得查询更容易,同时可以对集合进行操作,使得对数据库与集合的操作更加简单,如:linq to sql、linq to dataset等,linq查询表达式是以"from"开始,以一个"select子句"或是"group by子句"结束.
1、linq中的关键字
·from:指定数据源以 用来迭代数据源的变量(范围变量)
·where:过滤查询结果
·select:指定查询结果中的项
·group:通过某一关键字,对相关的值进行聚合
·into:存储聚合中的结果,或连接到一个临时变量
·orderby:查询结果按某一关键字升序或降序排列
·join:通过一个关键字,对两个数据源进行连接
·let:创建一个临时变量,来表示子查询的结果
2、system.linq.enumernable类的方法
·aggregate():对序列中的每一项应用同一个函数
·average():返回序列中每一项的平均值
·count():返回序列的总项数
·distinct():返回序列中不同的项
·max():返回序列中的最大值
·min():返回序列中的最小值
·select():返回序列中某些项或属性
·single():返回序列中的某一个单一值
·skip():跳过序列中指定数目的项并返回剩下的元素
·take():返回序列中的指数目的元素
·where():过滤序列中的元素
·orderby():返回发某一特定字段升序排序的结果
·orderbydescending():返回按某一特定字段降序排序的查询结果
·thenby():返回使用某一额外字段排序的查询结果
·thenbydescending():返回使用霜一额外字段进行降序排序的查询结果
·singleordefault():选择单独一行或默认的实例
·skip():允许跳过指定数量的记录
·take():允许获得一定数量的记录
4、 示例:
复制代码 代码如下:
list<string> linqlist = new list<string>() {
"demo1","demo2","demo3"
};
//lq是一个范围变量,where是条件,看起来很像sql语句
ienumerable<string> results = from lq in linqlist where lq.contains("2") select lq;
foreach (var result in results)
{
system.console.writeline(result.tostring());
}
结果:demo2
linq查询被翻译时会调用system.linq.enumernable类的方法,将linq语句翻译成查询语句与查询方法:var demo = linqlist.where(m => m.contains("2")).select(m => m); 结果同上
总结:
那些年学习c#,主要是对它的一些基础知识的学习,同时也是在asp.net web开发时更好的使用c#进行编程,此文以回忆那些年学习c#的日子。