1字符串与时间的互转

DateTime.TryParse将空字符串、为null或格式不正确,则转换为的DateTime所代表的值为:0001/1/1 0:00:00,此为DateTime.MinValue的值。

使用public static DateTime ParseExact(string s, string format, IFormatProvider provider);实例方法转换时间,可以指定转换的格式。其中format为输入字符s的格式。若指定的格式与输入字符格式不一样,会抛异常

例如:

//dateTime ="2017-11-18 17:25:53";会抛异常,这种类型对应格式为:yyyy-MM-dd HH:mm:ss

string dateTime = "20171118172553";

IFormatProvider yyyymmddFormat = new CultureInfo(String.Empty, false);

DateTime time = DateTime.ParseExact(dateTime, "yyyyMMddHHmmss", yyyymmddFormat);

2比较时间先后

使用DateTime的public int CompareTo(DateTime value);实例方法。

示例:

string dateTime = "2017-11-28 12:57:30";

DateTime dt;

DateTime.TryParse(dateTime, out dt);

int cr = dt.CompareTo(DateTime.Now);

如果cr大于0,dt时间晚于(当前时间)DateTime.Now,即时间的整数值大于DateTime.Now的整数值。

如果cr等于0,dt时间等于(当前时间)DateTime.Now,即时间的整数值等于DateTime.Now的整数值。

如果cr小于0,dt时间早于(当前时间)DateTime.Now,即时间的整数值小于DateTime.Now的整数值。

 

3 StreamWriter

将文件所在的目录传给StreamWriter的构造函数,而不是传递文件的全路径,那么会抛出如下的异常,看上去似乎是对文件目录没有访问权限,其实是错将文件目录传递给了StreamWriter构造函数。

4将Sream中的数据写入文件

错误的做法一:

获取流的长度然后转型为int,容易造成数据截断,导致未能读取流的全部内容。

        //读取
       long length = ;
using (Stream fs = new FileStream("D:\\命令行安装MySQL.docx", FileMode.Open))
{
length = fs.Length;
}
byte[] bytes = new byte[length]; using (Stream fs = new FileStream("D:\\命令行安装MySQL.docx", FileMode.Open))
{
int countIn = fs.Read(bytes, , (int)length);
}
       //写入
using (Stream fs = new FileStream("D:\\命令行安装MySQLnew.docx", FileMode.OpenOrCreate))
{
fs.Write(bytes, , (int)length);
}

错误做法二:

貌似不会发生错误类型一那样的情况,但还是会出现数据截断的现象。调用FileStream的Read实例方法:Read(byte[] buffer, int offset, int count),offset这个参数的类型是int型,这里将numBytesRead 转型为int,一旦这个偏移量超过这个值,那么读取的数据有一部分就是重复的。

        /读取
     using (Stream fs = new FileStream("D:\\命令行安装MySQL.docx", FileMode.Open))
{
int c = ;
long numBytesRead = ;
long numBytesToRead = fs.Length;
while (numBytesToRead>)
{
if (fs.Length - numBytesRead <= c)
{
c = (int)(fs.Length - numBytesRead);
}
int n = fs.Read(bytes, (int)numBytesRead, c);
numBytesRead += n;
numBytesToRead -= n;
}
}
       //写入
using (Stream fs = new FileStream("D:\\命令行安装MySQLnew.docx", FileMode.OpenOrCreate))
{
fs.Write(bytes, , (int)length);
}

正确的做法一:

确保上述错误做法中的源数据长度不超过int32的最大值。此外也可使用下面的方法,但同样要保证源数据长度不超过int32的最大值:

        //读取
       using (Stream fs = new FileStream("D:\\命令行安装MySQL.docx", FileMode.Open))
{
int c = ;
long position = ;
while (true)
{
position = fs.Seek(position, SeekOrigin.Begin);
if (position == fs.Length)
{
break;
} if (position + c > fs.Length)
{
c = (int)(fs.Length - position);
}
int n = fs.Read(bytes, (int)position, c);
position += n;
}
}
     //写入
using (Stream fs = new FileStream("D:\\命令行安装MySQLnew.docx", FileMode.OpenOrCreate))
{
fs.Write(bytes, , (int)length);
}

正确的做法二:

使用CopyTo(Stream destination)

CopyTo(Stream destination, int bufferSize)

使用第一个方法默认缓冲区大小为4096,现在看下源码片段:

     public void CopyTo(Stream destination)
{
...... InternalCopyTo(destination, _DefaultCopyBufferSize);
}

CopyTo方法中调用了InternalCopyTo方法,来看下InternalCopyTo方法的源码片段:

      private void InternalCopyTo(Stream destination, int bufferSize)
{
...... byte[] buffer = new byte[bufferSize];
int read;
while ((read = Read(buffer, , buffer.Length)) != )
destination.Write(buffer, , read);
}

InternalCopyTo方法内部调用了Read方法,下面来看一下Read方法源码片段:

然而在Stream这个类中并没有Read方法的具体实现,只有一个抽象方法:

public abstract int Read([In, Out] byte[] buffer, int offset, int count);

到这里已经可以看出CopyTo方法中的参数bufferSize的作用了,即设置内存缓冲区的大小,每次从流中读取长度为bufferSize的数据,放入缓冲区,然后写入目标流,重复这个过程直到所有的流都拷贝完成。那么在内存允许的范围内,bufferSize设置的越大效率越高。

        using (Stream fs = new FileStream("D:\\命令行安装MySQL.docx", FileMode.Open))
{
using(Stream fss = new FileStream("D:\\命令行安装MySQLnew.docx", FileMode.OpenOrCreate))
{
fs.CopyTo(fss);
}
}

5文件读写效率与对象频繁开关的影响

写文件方式一:

      public static void W()
{
for (int i = ; i < ;i++ )
{
string s = "sdfrgyjefgyhjdsfdfgfghgew"+i;
using (StreamWriter sw = new StreamWriter(@"D:\g.txt", true))
{
sw.Write(s);
}
}
}

方式二:

      public static void WT()
{
using (StreamWriter sw = new StreamWriter(@"D:\gT.txt", true))
{
for (int i = ; i < ; i++)
{
string s = "sdfrgyjefgyhjdsfdfgfghgew" + i;
sw.Write(s);
}
}
}

分析:

方式一每写一次文件,开关一次StreamWriter对象,而方式二将所有的字符串都写入文件后才关闭StreamWriter实例。统计数据如下:

循环次数

方式一

方式二

100万

21861ms

260ms

1000

231ms

13ms

C#要点补充的更多相关文章

  1. [.NET] 《Effective C#》快速笔记 - C# 高效编程要点补充

    <Effective C#>快速笔记 - C# 高效编程要点补充 目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 ...

  2. 《Effective C#》快速笔记(六)- - C# 高效编程要点补充

    目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 四十九.实现与 CLS 兼容的程序集 五十.实现小尺寸.高内聚的程序集 这是 ...

  3. CSS几个要点补充

    css的font-size属性一定要带px单位,font-weight:700[千万不要带单位哦]就等于font-weight:bold加粗 1.如何像淘宝页面一样,随着浏览器的减小而保持内容区大小不 ...

  4. [.NET] 《C# 高效编程》(一) - C# 语言习惯

    C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Con ...

  5. [.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

    <Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  6. [.NET] 《Effective C#》快速笔记(四)- 使用框架

    <Effective C#>快速笔记(四)- 使用框架 .NET 是一个类库,你了解的越多,自己需要编写的代码就越少. 目录 三十.使用重写而不是事件处理函数 三十一.使用 ICompar ...

  7. [.NET] 《Effective C#》快速笔记 - C# 中的动态编程

    <Effective C#>快速笔记 - C# 中的动态编程 静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静 ...

  8. 【机器学习实战】第7章 集成方法 ensemble method

    第7章 集成方法 ensemble method 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:是对其他算法进行组合的一种形式. 通俗来说: 当做重 ...

  9. 【机器学习实战】第13章 利用 PCA 来简化数据

    第13章 利用 PCA 来简化数据 降维技术 场景 我们正通过电视观看体育比赛,在电视的显示器上有一个球. 显示器大概包含了100万像素点,而球则可能是由较少的像素点组成,例如说一千个像素点. 人们实 ...

随机推荐

  1. 【转载】Android Studio 导入External Libraries

    转载: 世军  Android Studio 导入External Libraries http://www.cnblogs.com/shijunzhang/p/5625432.html 导入本地Li ...

  2. IDEA Translation插件中有道智云(有道翻译)应用ID,密钥申请教程

    登录链接 该登录登录,该注册注册(信息随意填写) 自然语言翻译=>翻译实例=>创建实例(信息随意填写) QQ截图20170701231552.png 应用管理=>我的应用=>创 ...

  3. iOS白名单设置

    在做分享.支付的时候需要跳转到对应的app,这里有需要设置的白名单列表<key>LSApplicationQueriesSchemes</key> <array> ...

  4. 写给自己的web总结——关于html的知识总结

    相信每个前端工程师初识前端之时,最先接触的都是html吧! html的全称是hyperText markup language, 超文本标记语言,在网页中所有的文字,图片,架构等都是由html来编写的 ...

  5. TCP/IP----基本知识

    就以这篇文章为起点,开始自己的学习计算机网络之路.这些仅是我个人之言,如有差错,希望读者能够逐一指出,在下不胜感激. 首先,我们需要知道一些关于网络的基本知识. 网络中的关系大多为拓扑结构.那么,何为 ...

  6. ASP.NET Core使用SkiaSharp实现验证码

    前言 本文并没有实现一个完成的验证码样例,只是提供了在当前.NET Core 2.0下使用Drawing API的另一种思路,并以简单Demo的形式展示出来. Skia Skia是一个开源的二维图形库 ...

  7. spring boot入门 -- 介绍和第一个例子

    "越来越多的企业选择使用spring boot 开发系统,spring boot牛在什么地方?难不难学?心动不如行动,让我们一起开始学习吧!" 使用Spring boot ,可以轻 ...

  8. bzoj 4199 [NOI2015]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  9. hello world 为什么我们看到学习中有这一句话!!!

    Hello World ,中文意思:你好,世界.世界上的第一个程序就是Hello World,由Brian Kernighan创作. Hello, world"程序是指在计算机屏幕上输出“H ...

  10. JMeter集合点

    位置:添加--> 定时器-->Synchronizing Timer     注意:集合点放在所有操作之前.   假设线程组线程数设置的是50个,那么希望50个都准备好一块上,那么集合点中 ...