.Net常用类库
一、String成员方法(常用)
1,bool Contains(string str) 判断字符串对象是否包含给定的内容2,bool StartsWith(String str):判断字符串对象是否以给定的字符串开始。
3,bool EndsWith(String str):判断字符串对象是否以给定的字符串结束。
案例:判断是否是网址:以http://开头、以.com或者.cn结尾。
案例:判断用户输入的邮件是否是QQ邮箱,用户输入的用户名是否包含“毛ze东”等敏感词 4,int Length 获取字符串的长度属性str.Length
5,char ch = str[3];
6,int indexOf(int ch) //返回指定字符在此字符串中第一次出现的索引
7,int indexOf(string str) //返回指定字符串在此字符串中第一次出现的索引
8,LastIndexOf //最后一次出现的位置
9,String Substring(int start) // 截取字符串,返回从指定位置开始截取后的字符串10,String substring(int start,int length) // 截取字符串,返回从指定位置开始截取指定长度length的字符串
11,String ToLower() //把字符串变成小写;
12,String ToUpper() // 把字符串变成大写
13,String Replace(char oldChar,char newChar) //用新的字符去替换指定的旧的字符;
14,String Replace(string lodStr,string newStr) // 用新的字符串去替换指定的旧的字符串
15,String trim() // 去除字符串两端的空格,
16,Trim(params char[] trimChars) // 去掉两端的给定的字符
17,TrimEnd和TrimStrat //去掉开头的和结尾的空格
18,String是不可变的,因此上面的操作都是生成新的字符串对象,要用返回值去接收新的字符串。
19,String[] Split() //重载方法很多,字符串按照分隔符切割。
案例:把字符串用“,”分割
二、String静态方法1,bool IsNullOrEmpty(string value) // 判断字符串是否为null或者是空字符串
2,bool Euqals(string a,string b,StringComparison.OrdinallgnoreCase) //对两个字符串进行不区分大小写比较 3,string Join(string separator,params string[] value) // 把一个数组(集合)用分隔符separator连接为一个字符串三、StringBuilder因为字符串的不可变,在字符串进行连接的时候会产生新的字符串对象,造成浪费
1,Append();
StringBuilder sb = new StringBuilder(); sb.Append(s1); sb.Append(s2).Append(s3);//因为Append方法把this对象(当前对象)返回了,所以可以链式编程 最后使用String s = sb.ToString(),一次性生成拼接结果字符串即可 2,AppendLine();将默认的行终止符追加到当前 System.Text.StringBuilder 对象的末尾。(追加完,回车)
四、可空的intint是值类型,不能为null。在C#中可以用int?表示“可空的int”
注意类型的转换:
int? i = 5;
if(i!=null) { int i1 = (int)i;//需要进行强转 } 也可以通过i.HasValue,判断是都为null、i.value获取i的值 通过IL可知,int?其实被编译器翻译为Nullable<int>类型五、日期类型DateTime类表示时间数据类型。属于结构体,因此是值类型
DateTime.Now 当前时间,
DateTime.Today 当前日期
可以通过Year、Month、Hour的属性得到日期的年、月、小时等部分; 也可以用构造函数根据给定的时间创建一个对象六、异常的概念 异常发生在程序发生的不正常情况下。异常以一个异常类对象的形式抛出,异常类描述异常信息、发生的位置等。 异常的根类为Exception。异常类一般都继承自Excrption七、异常的捕捉try
{ String s = null; s.ToString(); } catch(NullReferenceException ex) { Console.WriteLine("为空"+ex.Message); } ex就是发生异常的异常类对象,变量名只要不冲突就任意 在异常处理中,一旦try里面有问题了。放弃try代码块中之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行
八、多个异常的处理 try { int a = 10; int b = 0; Console.WriteLine(a/b); int[] arr = {1,2,3}; Console.WriteLine(arr[3]); } catch(DivideByZeroException ae) { Console.WriteLine("除数不能为0"); } catch(IndexOutOfRangeException ae) { Console.WriteLine("数组越界异常"); } 可以catch住父类异常,这样就可以抓住所有子类异常了,但是强烈不建议这样做,不要没理由的catch异常九、不要吃异常 catch(Exception ex) { //空代码 } 不要只是把异常catch住什么都不做或者只是打印一下,这不是正常的“异常处理” 不知道怎么处理就不要catch,出错比“把错误藏起来”好。这样以为“不会出错了”,其实是把异常“吃掉了”,会让程序陷入混乱状态要合理的处理异常
十、finallytry
{ //有可能有问题的代码 } catch(异常类型 异常变量) { //处理方式 } finally { //无论是否出现异常,都要执行的代码 } finally中一般进行资源的回收等。十一、File文件类File是静态类(无法被New),其主要的静态方法有:
1,void Delete(string path) 删除文件
2,bool Exists(string path) 判断文件是否存在
3,string[] ReadAllLines(string path) 将文本文件中的内容读取到string数组中
4,string ReadAllText(string path) 将文本文件读取为一个字符串
5,void WriteAllLines(string path,string[] contents) 将string[]写入到文件中
6,void WriteAllText(string path,string contents) 将字符串contents写入到文件path中
7,AppendAllText 向文件中附加内容
8,Copy 复制文件
9,Move 移动文件
十二、Directory文件夹类,为static类1,CreateDirectory(string path) 创建文件夹全路径
2,void Delete(string path,bool recursive) 删除文件夹path,recursive表示是否也删除子文件及子文件夹。 如果文件夹不为空,recursive=false,则抛异常 示例代码:Directory.Delete(@"全路径", true); 3,boolExists(string path) 判断文件夹是否存在 4,Directory.EnumerateFiles(); 返回指定路径中的文件名的可枚举集合。 5, Directory.EnumerateDirectories(); 返回指定路径中与搜索模式匹配的目录名称的可枚举集合。十三、流 Stream1,File类提供了读写文本文件的方法,但是对于大文件不能用它提供的方法,太占内存,需要一种“流式处理”的方法
2,.Net将IO操作(文件、网络等)简化成流模型Stream,是抽象类,网络、文件、加密稍等都是不同的子类,
最常用的子类是FileStream、MemoryStream等
3,使用Stream的时候虽然可以: FileStream fs = new FileStream(); 但是,Stream fs = new FileStream();更好! 在使用的变量类型提供的操作能满足的前提下,尽可能的用父类、接口声明变量,(体现了多态的思想), 4,FileStream写入文件 FileStream fs = new FileStream(@"D:\1.txt", FileMode.Create);//创建一个文本文件 byte[] bytes = Encoding.Default.GetBytes("你好如鹏网");//将“你好如鹏网”进行编码成byte数组对象 fs.Write(bytes, 0, bytes.Length);//操作fs对象进行写入 fs.Close();//关闭流Stream写入的单位是byte(字节),char转换为byte时候,一个英文char转换为一个byte(对应的ASCII码),一个中文char转换为两个byte
采用Default、UTF8、UTF32得到的字符串的byte[]长度不一样,因此说明不同类型编码在计算机中存储的不一样。用什么编码写入就用什么编码读取,否则会有乱码的问题。
注意:不要往C盘写,因为Win7、Win8默认普通程序没有权限读写C盘 5,FileStream读取 1,byte[] bytes = new byte[4]; 每次读取多个字节数据,不能一次把一个文件读取出来,否则太占用内存,因为数组是占用内存的。 这个叫做“缓冲区”,设的太小CPU和硬盘会很忙,设的太大内存会很“撑” 2,while((len = fs.Read(bytes,0,bytes.Length))>0) 继续从流中读取最多bytes长度那么多字节的数据拷贝到bytes数组中。 下次read是从上次最后一个read最后的位置之后开始读,一次次的读取read方法返回这次一共读了多少字节(比如遇到最后一次读取可能读不满), 一旦返回的=0了,就说明读完了。 对于没被赋值初始值就是0,因为没被填满的数组位置是0. 3,String s = Encoding.Default.GetString(bytes,0,len); 把byte[]转换成对应string,考虑bytes没有充分利用的情况 4,字节流不适合读取内容中包含文本文档,容易造成数据错乱(byte[]中含有一半的汉字)。要用后面讲的StreamReader
十四、资源的关闭1,在上面的程序有缺陷,如果write的时候发生异常,fs就不会close,其他程序就无法写入这个文件了,也会占用资源
2,资源要使用完毕才能close,一旦close之后再操作就会出错 3,正确是做法是放在using(){}里面十五、using 1,可以同时声明多个资源 using(MyFile f1 = new MyFile()) using(MyFile f2 = new MyFile()) { } 2,using其实就是编译器简化的try。。finally操作, 3,using只是try。。finally,如果需要catch,只管catch就是了 4,注意:实现了IDisposable接口的对象用完了,都要Dispose十六、复制文件1,使用两个FileStream配合完成文件拷贝:
从源文件的FileStream中读取一部分内容,再写入到目标文件的FileStream中。 解释代码: 1,while((len = inStream.Read(bytes,0,bytes.Length))>0) 把读取并且返回读取的长度给len,然后判断len的值,综合为了一句话。 2,outStream.Write(bytes,0,len); 每次write都会从上次write的最后位置接着写入。将byte[] 数组b写入outStream中,off代码距离当前写入位置的偏移量,一般写0,len代表写入多长。 缓冲区先设置50,,修改为1M,体会速度的变化。使用StopWatch类进行代码计时。 2,封装一个Copy方法 封装一个函数void copy(Stream inStream,Stream outStream,int bufferSize)用来把inStream拷贝到outStream中, 缓冲区大小为bufferSize。要检查参数合法性(是否为null、bufferSize是否在合理范围) 3,.Net 4.0之后Stream类中提供了一个CopyTo方法 4,Reader、Writer(文本内容) 直接用Stream进行文本文件的读写会比较麻烦,因为需要考虑文件的编码、中文字符等的问题 StreamReader、StreamWriter是用来读写字符流(characterstream)的类,会帮着自动处理麻烦的问题十七、编码1,由于历史原因,汉字等如何在计算机中以字节存储存在着多种标准,最常见的是GB2312(国家标准、表示汉字)、
GBK(GB2312的扩展,还能表示繁体字等)、UTF-8(国际标准)、UTF-16等 2,ANSI表示采用当前操作系统的默认编码,如果是中文Windows,默认就是GBK 3,用什么编码保存就用什么编码读取,就不会乱码 4,如何用其他编码保存?由StreamWriter构造函数决定:new StreamWriter(outStream, Encoding.UTF8 怎么初步判断用了什么编码?记事本打开另存为,可以看到 5,读取的编码由StreamReader构造函数决定十八、泛型容器List<T>1,数组长度是固定的,List<T>可以动态增删内容。
List<T>是泛型的,可以在声明的时候指定放什么类型的数据。
2,如何增加List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.AddRange(new int[]{1,2,3,4,5});
list.AddRange(list2);//添加另外一个list
3,如何遍历 int[] nums = list.ToArray();//List泛型集合可以转换为数组List<string> listStr = new List<string>();
string[] str = listStr.ToArray();
十九、泛型字典Dictionary<Key,Value>1,如何增加
Dictionary<string,string> dict = new Dictionary<string,string>(); dict.Add("zs","张三"); dict.Add("ls","李四"); dict.Add("ww","王五"); 2,如何修改 dict["ls"] = "小赵"; String s = dict["ww"]; 3,判断是否包含 dict.ContainsKey();二十、foreach1,除了使用for循环可以进行遍历外,实现了IEumerable接口的对象还可以使用foreach进行遍历
string[] strs = {"asdasd","qweqweq","gdfg"}; foreach(string s in strs) { Console.WriteLine(s); } 2,List<T>、Dictionary<K,V>等一切实现了IEnumerable接口的对象都可以进行遍历 Dictionary<string,object> dict = new Dictionary<string,object>(); dict["rupeng"] = 888; dict["sina"] = "hehe"; dict["baidu"] = true; foreach(KeyValuePair<string,object> kv in dict) { Console.WriteLine(kv.Key+"="+kv.Value); }