那些年,我还在学习C# 学习笔记续

 更新时间:2020年6月25日 11:44  点击:1742
那些年,我还在学习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#的日子。
[!--infotagslink--]

相关文章

  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • php Observer观察者模式之学习笔记

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • PHP 日期函数 学习笔记介绍

    举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
  • Android学习笔记之多界面切换实例

    一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
  • php中的变量引用传值学习笔记

    引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
  • PHP中的cURL请求及示例学习笔记

    cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
  • 那些年,我还在学习C# 学习笔记

    那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
  • YII2 WIDGET的学习笔记

    CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
  • metasploit调用nexpose扫描学习笔记

    Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25
  • php学习笔记之PHP扩展开发教程

    PHP扩展开发不是所有开发者都会操作的一个东西,下面我来演示一个关于PHP扩展开发实现过程,各位同学有需要可进入参考。 我们先假设需要这样一个扩展,提供一个叫tao_s...2016-11-25
  • Yii2学习笔记之汉化yii设置表单的描述

    小编推荐的这篇文章介绍了Yii2学习笔记之汉化yii设置表单的描述,非常实用,有兴趣的同学快来看看吧。 一:汉化框架&#8195;&#8195;框架汉化在这里设置,如果不生效,前台后...2017-07-06
  • php Builder建造器模式学习笔记

    星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队,存在一个问题,初始化画面的流程很乱。待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制...2016-11-25
  • php中session学习笔记

    Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个...2016-11-25
  • PHP单例模式学习笔记详解

    单例模式是php中一个为了简化大家开发及重复调用的一个功能,下面我来给各位朋友详细介绍单例模式用法。 1.单例模式的概念 顾名思义,单例模式只有一个实例,而且自行...2016-11-25
  • php正则表达式子模式的反向引用学习笔记

    本文章给大家分享一篇php正则表达式子模式的反向引用学习笔记,希望此教程对各位朋友有帮助哦。 需要用正则表达式获取字符串的标题。标题标签是h1~h6。 使用正则...2016-11-25
  • php 适配器模式的学习笔记

    适配器模式许多和php程序员都没有碰到关于适配器的应用了,这里小编整理了两个关于适配器的使用例子,下面我们就一起来看看吧,希望各位有帮助。 【目的】:将一个类的...2016-11-25
  • php与mysql数据库cookie Session 分页学习笔记

    下面整理了是一些在学习php mysql中我们一些常用的知识点,包括有分页,连接数据库及时登录与文件上会以的知识点,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
  • PHP CodeIgniter学习笔记详解

    今天做的是个简单的表明表页面,前端我用的是Bootstrap。没办法,自己不懂美工,也只有用别人的工具。BS真的很漂亮,而且插件丰富,不愧是twitter工程师弄出来的东西。 (中...2016-11-25
  • PHP单例模式学习笔记

    为了达到这种目的,必须保证整个项目有且只有一个实例存在并提供一个访问点供全局访问。这就需要通过调用此类的一个共用静态方法来访问这个实例,也就是说此类不能在类外...2016-11-25