常用类库之.NET中的字符串
字符串的特性 1.不可变性 由于字符串是不可变的的,每次修改字符串,都是创建了一个单独字符串副本(拷贝了一个字符串副本)。之所以发生改变只是因为指向了一块新的地址。 2.字符串池(只针对字符串常量) 当一个程序中有多个相同的字符串常量时,多个变量指向的是内存中同一块字符串!这个特性叫字符串池。之所以字符串,不会造成程序混乱,是因为字符串的不可变性。 String的成员方法和属性 PS:这里重载方式很多,不一一列举。 1.Contains(String str) 判断字符串中是否包含,指定字符串。 用法 string str ="helloworld"; str.Contains("hello"); //true 2.StartsWith(String str) 判断字符串对象是否以,指定字符串开头。 3.EndWith(String str) 判断字符串对象是否以,指定字符串结尾。 4.Length 属性 获取字符串的长度 5.IndexOf(String str) 获取指定字符/字符串.....在对象字符串中第一次出现的位置。 6.LastIndexOf(String str) 获取指定字符/字符串....在对象字符串中最后一次 出现的位置。 7.SubString(int start) SubString(int strat, int length) 从指定位置,截取字符串。 8.ToLower() 将串转换成小写,返回一个新的全小写的字符串。 9.ToUpper() 将串转换成大写,返回一个新的全大写的字符串。 10. Replace(string oldStr,string newStr) 用新的字符串,替换对象字符串中老的字符串部分。 11.Trim() 去掉对象字符串两端的空格 TrimStart() 去掉对象字符串 开头的空格 TrimEnd() 去掉对象字符串 结尾的空格 PS:如果想去掉其他的开头结尾的其他字符其他的字符,可以采用Trim()的其他重载。 12.Split() 把对象字符串,按照指定字符分割成一个字符串数组! Split() 的重载同样很多, 例如 Split(new char[]{‘|‘}, StringSplitOption.RemoveEmptyEntries)// 删除空数据 String的静态方法 1.IsNullOrEmpty(string) //string.IsNullOrEmpty(str1) 判断某字符串是否为null,或者为空字符串。 2.Equals(string,string,StringComparison.OrdianlIgnore) 忽略大小写比较两个字符串是否相同。 3.Join(string,string[]) 把一个数组按照指定字符串,拼接成一个字符串。 .NET中的计时器控件Timer 本章借介绍一些粗浅的Timer控件使用方法。 介绍Timer控件的常用属性和事件 1. Interval 属性表示 Timer控件的时间间隔。 类型是int默认是毫秒。 2. Enabled 属性 表示Timer控件是否激活。 如果激活的话,一进入Timer的Tick事件就开始执行。所以默认是false 3. Start() 方法 开始执行 4. Stop() 方法 停止执行 5. Tick 事件 表示Timer控件将要执行的代码。 常规使用方式 1.添加一个Timer控件 2.设置好必要的属性后。直接写 timer_Tick事件。在事件中写个停止条件就好了。 使用Lambda表达式调用Timer Timer timer = new Timer(); timer.Interval = 100; //使用Lambda表达式 timer.Tick += (sender,e) => { if (巴拉巴拉巴拉) { timer.Stop(); } }; timer.Start(); .NET中的StringBuilder 为什么要使用StringBuilder 为什么使用StringBuilder要从string对象的特性说起。 string对象在进行字符串拼接时,因为字符串的不可变性,string对象会每次拼接,都会复制一个副本出来进行运算,而本身的串仍然留在内存中,大量的临时片段会造成不可忽视的性能损耗。所以在进行大量的字符串拼接时建议使用StringBuilder StringBuilder的简单使用方式 string s1 = "33"; string s2 = "44"; string s3 = "55"; //需求是把 s1 s2 s3拼接在一起。这是一种典型的字符串拼接。 //使用StringBuilder ,不会产生无用的临时字符串。 StringBuilder sb =new StringBuilder(); //拼接方式一 sb.Append(s1); sb.Append(s2); sb.Append(s3); //拼接方式二 //因为Append()方法会返回一个this,也就是对象本身。所以可以使用这种方式。 //链式编程 Jquery中常用这种方式 sb.Append(s1).Append(s2).Append(s3); //最后把sb.ToString()一下就好了。 PS:AppendLine()方法可以 自动添加一个回车。 .NET 中的DateTime DateTime简介 DateTime是.NET中的时间类型,可以通过DateTime完成诸如获取当前的系统时间等操作。 DateTime在.NET中是一个结构体,而并不是一个类。 clipboard 如上图所示,clipboard[1]这个图标在VS中 表示结构体。 DateTime的常用方法和成员 1.Now 获取当前系统时间。格式如下图 clipboard[2] 2.Today 获取当前今日日期。格式如下图 clipboard[3] 3.年 月 日 时 分 秒 接下来的几个对象,必须通过 DateTime.Now(或者DateTime.Today)再点才能引用的到。 Year 获取年 Hour 获取小时 Month 获取月 Minute 获取分钟 Day 获取日 Second 获取秒 //以Year为例:DataTime.Now.Year 4.DayOfWeek、DayOfYear 获取当前日期是星期几 以及获取当前日期是一年中的第几天 5.TryParse() 判断是否是时间类型,参数中有一个out可以输出一个DateTime对象。 6.AddDays()、AddHours() 在当前时间基础上加几天 返回一个DateTime 在当前日期基础上加几个小时 返回一个DateTime 7.Subtract(DateTime.Now) 比较两个时间的 时间差 返回一个TimeSpan 日期时间格式字符 ToString() 预定义模式 DateTime date =DateTime.Now; date.ToString(format) 参数format格式详细用法 格式字符 关联属性/说明 d ShortDatePattern D LongDatePattern f 完整日期和时间(长日期和短时间) F FullDateTimePattern(长日期和长时间) g 常规(短日期和短时间) G 常规(短日期和长时间) m、M MonthDayPattern r、R RFC1123Pattern s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601) t ShortTimePattern T LongTimePattern u UniversalSortableDateTimePattern 用于显示通用时间的格式 U 使用通用时间的完整日期和时间(长日期和长时间) y、Y YearMonthPattern 自定义模式 d 月中的某一天。一位数的日期没有前导零。 dd 月中的某一天。一位数的日期有一个前导零。 ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。 dddd 周中某天的完整名称,在 DayNames 中定义。 M 月份数字。一位数的月份没有前导零。 MM 月份数字。一位数的月份有一个前导零。 MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。 MMMM 月份的完整名称,在 MonthNames 中定义。 y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。 yyyy 包括纪元的四位数的年份。 gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。 h 12 小时制的小时。一位数的小时数没有前导零。 hh 12 小时制的小时。一位数的小时数有前导零。 H 24 小时制的小时。一位数的小时数没有前导零。 HH 24 小时制的小时。一位数的小时数有前导零。 m 分钟。一位数的分钟数没有前导零。 mm 分钟。一位数的分钟数有一个前导零。 s 秒。一位数的秒数没有前导零。 ss 秒。一位数的秒数有一个前导零。 .NET中的异常和异常处理 .NET中的异常(Exception) .net中的中异常的父类是Exception,大多数异常一般继承自Exception。 可以通过编写一个继承自Exception的类的方式,自定义异常类! 异常处理机制 Try { 可能发生异常的代码 后续代码 } Try以外的代码 catch(Exception e) { } finally { } 上述代码描述如下 1.谁能执行 在异常处理中,一旦try里面有了问题,程序会放弃异常的后续代码直接跳到catch中。 执行完了catch中的代码,继续执行Try以外的代码。 2.关于catch()中的参数e e就是发生异常的异常类对象,可以任意取名。不是必须叫e的。 3.只抛一个 一块try中的代码只能抛出一个异常。 为什么呢? 因为一旦异常就抛出了啊,后面有也不执行了呀! 4.获取信息 可以通过 e.Message获取异常信息 5.必须执行 finally 无论如何都会执行 6.可以没有catch 可以只有 try catch 也可以只有try finally 优秀的异常处理作风 1.不要逃避问题不要只把异常catch住,什么都不做,或者只是打印一下,这不是优秀的“异常处理”作风。 不知道怎么处理异常,就不要catch。让他暴露出来。既然发生异常了,问题就肯定是有的,逃避不是办法,直面他,才能解决他。尤其在分层的项目中。会让程序陷入深度的逻辑混乱状态。而问题被藏起来了,你甚至不知道哪里发生了问题。 2.如果真的遇到乱try、catch的程序员怎么办? vs很强大,它想到了这种情况。点击【调试】【异常】进入这样一个工具,选中第二行 的引发选项。 clipboard[4] 这样在调试的时候,无论是否try catch都会暴漏出异常。我们想要的信息就找到了。 .NET中的IO操作基础介绍 关于IO简介 .NET中的IO操作,经常需要调用一下几个类。 clipboard[5] 1.FileStream类 文件流类,负责大文件的拷贝,读写。 2.Path类 Path类中方法,基本都是对字符串(文件名)的操作,与实际文件没多大关系。 3.File类 File类可以进行一些对小文件拷贝、剪切操作,还能读一些文档文件。 4.Dirctory 目录操作,创建文件、删除目录,获取目录下文件名等等。 Path类 1.ChangeExtension(path,".jpg") 改变文件后缀名! 2.Combine(s1,s2) 将两个路径连起来 3.获取文件名的几个方法 1)Path.GetFileName(s1); //获取路径中的文件名 2)Path.GetFileNameWithoutExtension(s1); //获取文件名,不包括后缀名! 3)Path.GetDirectoryName(s1)//获取路径中的目录不包括文件名。 4)Path.GetExtension(s1); //只获取扩展名 4.GetFullPath("") 获取完整路径,根据相对路径获得绝对路径。 5.临时目录 1)GetTempPath() //获取当前用户的临时目录 2)GetTempFileName() //获取一个随机的文件名,并在临时目录下创建这个文件。 3)GetRandomFileName() //仅获取一个随机文件名。 Directory类 1.创建目录 Directory.CreateDirectory(@"目录"); 2.判断某个目录是否存在某文件 string path =@"路径"; if(Directory.Exists(path)) { } 3.删除目录 1)Directory.Delete(path); //删除空目录 ,目录下没有文件了。 2)Directory.Delete(path,true); //不管空不空,都删! 3)如果没有目录就会报异常,最好用if(Directory.Exists(path))判断一下。 4.移动文件目录 重命名目录也用这个来做。 Directory.Move(@"c:\a",@"c:\abc"); 5.DirectoryInfo 可以把文件夹当作对象来使用 DirectoryInfo dirInfo = new DirectoryInfo(@"path"); 6.获取当前目录下的所有直接子目录 和 直接子文件 //获取目录下的直接子目录 String[] dirs =Direcotory.GetDirectories(@"目录"); //获取目录下的直接子文件 String[] files =Directory.GetFiles(@"目录"); 7.获取当前目录下的目录和文件 另一种方式 //获取目录下的直接子目录 //String[] dirs =Direcotory.GetDirectories(@"目录"); //获取目录下的直接子文件 //String[] files =Directory.GetFiles(@"目录"); //—————————以上是6中的做法,他有一定性能上的问题。什么问题呢?————————————— 使用String[] dirs =Direcotory.GetDirectories(@"目录");是必须要等获取了整个string之后,才能遍历这个集合。 如果希望,读到一条处理一条。 建议使用Directory.EnumerateFile() 1)EnumerateFile返回的是一个实现了IEnumerable接口的集合。实际上使用了迭代器模式。 2)SearchOption.ALLDirctories参数,会让.EnumerateFile()遍历所有子目录下的文件。 File类 1.拷贝 File.Copy("Source"," Target",true); 2.判断是否存在 File.Exists(@"Source") ; 3.剪切 File.Move("Source","Targe"); 4.创建 File.Create("path"); 5.删除 File.Delete("path"); //删除,若没有,不报错! 6.读操作 1)File.ReadAllLines("path",Encoding.Default); //返回一个string[] 2)File.ReadAllTest("path",Encoding.Default); //string 3)File.ReadAllBytes("path"); 7.写操作 1)File.WriteAllLines("path",new string[4],Encoding.Default);//按行写入一个文件中。 2)File.WriteAllText("path","string"); 3)File.WriteAllBytes("path",new byte[4]); 4)File.AppendAllText(); //将string追加到文件中。 8.返回FileStream的快捷方式 1)File.Open(string,FileMode); //返回一个FileStream 2)File.OpenRead(string,FileMode); //返回一个只读的 FileStream 3)File.OpenWrite(string,FileMode); //返回一个只写的 FileStream .NET中的IO操作之文件流 读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不会直接等于文件大小的。这里只有读,所以就这么干了。 byte[] bytes =new byte[fsRead.Length]; //3.开始读取, 返回值是读取到的长度。 int r =fsRead.Read(bytes,0,bytes.Lenght); //4.关闭释放流 fsRead.Close(); fsRead.Dispose(); 写操作 //1.创建写入的文件流 FileStream fsWrite fsWrite =new FileStream(@"xxx",FileMode.OpenOrCreate); //2.创建缓冲区 String msg ="HelloWorld"; byte[] bytes =Enconding.UTF8.GetBytes(msg); //3.开始写入 fsWrite.Write(bytes,0,bytes.Length); //4.关闭 fsWrite.Close(); fsWrite.Dispose(); byte数组与string之间的转换 /*在文件流写入的时候,经常需要string 和 byte数组之间的转换。 这里简单的描述一下,这方面的做法。*/ 1.string 到 byte[]数组。 string msg ="HelloWorld"; //使用UTF8编码 byte[] bytes =System.Text.Encoding.UTF8.GetByte(msg); //使用系统默认编码 byte[] bytes =System.Text.Encoding.Default.GetByte(msg); 2.byte[]到string string newMsg =System.Text.Encoding.UTF8.GetString(bytes); 编码问题 为什么中文会乱码? UTF8 编码中,一个中文字符占用两个字节。 GBK 编码中,一个中文字符占用三个字节。 UTF8 编码中,用两个字节保存一个汉字,如果你用GBK读取,按照三个字节一个字的格式去读。当然乱码了。反之也是一样的。 总结起来,无论是36码的鞋子,穿在50码的脚丫子上。还是36码的脚丫子,穿50码的鞋。看起来都不会很舒服。 所以,按照什么格式写入,就按照什么格式读取。才是正解。 PS:1.Utf8是国际标准。 2.GB2312 是国标编码,支持中文的。 3.GBK是对GB2312的扩展,支持繁体中文。 什么类可以Dispose( )? 1.Dispose()表示释放资源,.NET中对Dispose()有一个统一的约定或者叫描述。这个约定表现为一个接口。 或者说这个接口,是一个红头文件,红头文件中约定了如何释放资源。 所有实现了IDisposable接口的类都可以释放,可以Dispose(); 那么类库中什么样的类会实现IDisposable接口呢? 我的理解是这样的,一般仅占用托管堆中内存资源的类或对象。一般不需要Dispose()。垃圾回收就搞定了。 但是对于,文件句柄,网络端口号,数据库连接等,CLR的垃圾回收机制是不管的。 所以一般这部分内容需要实现IDisposable接口。 文件流操作的异常处理 //只有把fs定义在这里,finally中才能引用得到。 FileStream fs =null; try { fs =new FileStream(@"文件路径",FileMode.Create); byte[] bytes = Encoding.Default.GetBytes("HelloWorld"); fs.Write(bytes,0,byte.Length); } finally { if(fs != null) //如果fs未赋值,那么直接Dispose就会引发空指针异常。 { fs.Dispose(); } } 简化上述的写法,虽然严谨但是稍微有点麻烦。Microsoft提供了语法糖。 就是using的语法 using(某个可以释放资源的类) { 操作 } //1.操作执行完,会自动释放。 //2.using语句编译完成以后,会形成跟上面类似的代码。就是使用try finally。 StreamWriter和StreamReader //按行写入 StreamWriter sw =new StreamWriter(@"target",true,Encoding.GetEnconding("GB2312")); sw.WriteLine("HelloWorld"); //按行读取 StreamReader sr =new StreamReader(@"Source"); sr.ReaderLine(); //每次返回一个字符串
来源:http://www.cnblogs.com/mcad/p/4203746.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。