NET基础学习笔记7
装箱和拆箱
1.装箱:将【值类型】转化为【引用类型】的过程叫,装箱。
2.拆箱:将【引用类型】转化为【值类型】的过程叫,拆箱。
1 int n=10; 2 object o=n;//发生了装箱。 3 int m=(int)o;//发生了拆箱。 4 5 int n=10; 6 string s1=Convert.ToString(n);//没发生装箱拆箱 7 int m=int.Parse(s1); 8 //发生了类型转换,但是绝对不叫装箱或者拆箱。 9 //由于字符串类型与int类型在内存上根本不存在“交集”,也根本无法发生类型转换,而object与int则可以转换,因为任何类型都是继承自object类型的。 10 11 int n=100; 12 object obj=n;//装箱 13 double d=(double)obj;//拆箱报错 14 //注意:装箱的时候,使用什么类型来装箱,拆箱的时候还应该使用对应的类型来拆箱。 15 16 int n1=10; 17 IComparable com=n1;// 18 int m=(int)com; 19 20 //由于Int32还实现了IComparable接口,但接口是引用类型。所以可以在Int32与IComparable之间发生类型转换,又由于接口是引用类型,所以Int32到IComparable发生了装箱,IComparable到Int32发生了拆箱。
ArrayList list=new ArrayList(); Stopwatch watch=new Stopwatch(); watch.Start(); for(int i=0;i<100000000;i++) { list.Add(i); } watch.Stop(); Console.WriteLine(watch.Elapsed); List<int> list1=new List<int>(); Stopwatch watch=new Stopwatch(); watch.Start(); for(int i=0;i<100000000;i++) { list.Add(i); } watch.Stop(); Console.WriteLine(watch.Elapsed); 比较发现。装箱耗时比不装箱慢十倍不止。
能用foreach遍历拜访的对象需求完成() 接口或声明 ( GetEnumerator)办法的类型。.
GetEnumerator()这个方法的作用不是用来遍历的,而是用来获取一个对象。这个对象才是用来遍历的。
文件流学习
文件操作常用的相关类:
File //操作文件,静态类,对文件整体操作。拷贝,删除,剪切等。
Directory //操作目录(文件夹),静态类。
DirectoryInfo //文件夹的一个“类”,用来描述一个文件夹对象(获取指定目录下的所以目标时返回一个DirectoryInfo数组。)
FileInfo //文件类,用来描述一个文件对象。获取指定目录下的所有文件时,返回一个FileInfo数组。
Path //对文件或者目录路径进行操作
Stream //文件流,抽象类。
FileStream 文件流,MemoryStream内存流,NetworkStream网络流。StreamReader快速读取文本文件。StremWriter 快速写入文本文件。
Path类(对字符串操作)
目录和文件操作的命名控件System.IO
string ChangeExtension(string path, string extension) (*)
修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名
string s = Path.ChangeExtension(@"C:\temp\F3.png", "jpg")
string Combine(string path1, string path2)
将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题
string s = Path.Combine(@"c:\temp","a.jpg")
string GetDirectoryName(string path) (*)
得到文件的路径名。Path.GetDirectoryName(@"c:\temp\a.jpg")
string GetExtension(string path) 得到文件的扩展名
string GetFileName(string path) 得到文件路径的文件名部分
string GetFileNameWithoutExtension(string path) 得到去除扩展名的文件名
string GetFullPath(string path) 得到文件的全路径。可以根据相对路径获得绝对路径。
string GetTempFileName() 得到一个唯一的临时文件名(*)
string GetTempPath() 得到临时文件夹的路径(*)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace _1.IO流Path类使用案例 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string path = "C://a1.exe"; 14 //这里只是把字符串的后缀改。与实际存储在磁盘的文件没有关系。只是对字符串的操作,与实际文件没关系。 15 path=Path.ChangeExtension(path, ".tet"); 16 Console.WriteLine(path); 17 18 string s1 = @"c:\a"; 19 string s2 = "b.txt"; 20 string s3 = Path.Combine(s1, s2); 21 //将两个路径连接起来,可以处理末尾的\问题。 22 Console.WriteLine(s3); 23 24 string namepath = @"C:\a\b\c\d.txt"; 25 //1.获取文件名。 26 string filename = Path.GetFileName(namepath); 27 //2.获取路径中的目录,不包含文件名。 28 string diractoryname = Path.GetDirectoryName(namepath); 29 //3.获取文件名没有后缀。 30 string filenamewithoutextension=Path.GetFileNameWithoutExtension(namepath); 31 //4.只获取扩展名: 32 string extension=Path.GetExtension(namepath); 33 Console.WriteLine("文件名:{0}目录路径:{1},{2},{3}", filename, diractoryname, filenamewithoutextension,extension); 34 35 //获取相对路径的绝对路径: 36 Console.WriteLine(Path.GetFullPath("1.IO流Path类使用案例.vshost.exe")) ; 37 38 //获取当前用户的临时目录: 39 Console.WriteLine(Path.GetTempPath()); 40 //获取随机的文件名,并且在临时目录中创建这个文件。 41 Console.WriteLine(Path.GetTempFileName()); 42 //获取一个随机的文件名,(可以用来做文件夹名) 43 Console.WriteLine(Path.GetRandomFileName()); 44 Console.ReadKey(); 45 } 46 } 47 }
操作目录(Directory)
资料管理器
为了实现目录树,所以要掌握读取目录的类
Directory和DirectoryInfo
void Delete(string path, bool recursive) 删除目录, recursive表示是否递归删除,如果recursive为false则只能删除空目录
bool Exists(string path) 判断目录是否存在
string[] GetDirectories(string path) 得到一个目录下的子目录
string[] GetDirectories(string path, string searchPattern, SearchOption searchOption) 通配符查找目录下的子目录,可以搜索到隐藏文件。
static string[] GetFiles(string path) 得到一个目录下的文件
string[] GetFiles(string path, string searchPattern, SearchOption searchOption) 通配符查找目录下的文件
DirectoryInfo GetParent(string path) 得到目录的父目录
move() //移动、剪切。只能在同一个磁盘中。目录没有Copy方法。可以使用Move()方法实现重命名。
create()
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace _02Diractory类 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 ////1.创建一个目录。 14 //Directory.CreateDirectory(@"c:\test\createdirectory"); 15 //Console.WriteLine("ok"); 16 17 ////2.获取当前目录的子目录 18 ////string[] dirs = Directory.GetDirectories(@"c:\"); 19 //string[] dirs = Directory.GetDirectories(@"c:\","*i*",SearchOption.TopDirectoryOnly); 20 //foreach (var item in dirs) 21 //{ 22 // Console.WriteLine(item); 23 //} 24 //Console.WriteLine("++++++++++++++++++++++++++++++++++++++++"); 25 ////3.获取当前目录的文件名: 26 //string[] files = Directory.GetFiles(@"c:\"); 27 //foreach (var item in files) 28 //{ 29 // Console.WriteLine(item); 30 //} 31 ////4.判断是否存在某个文件: 32 //string path = @"C:\test"; 33 //if (Directory.Exists(path)) 34 //{ 35 // Console.WriteLine("存在这个目录"); 36 37 //} 38 //else 39 //{ 40 // Console.WriteLine("不存在这个目录"); 41 //} 42 ////5.删除此路径目录 ,要空的才可以删除%>_<%。 目录不存在和不为空都会报错,所以在删之前,要检查 43 ////Directory.Delete(path); 44 //Directory.Delete(path, true);//true 表示将当前目录以及里面的所有内容都删除。 45 //Console.WriteLine("删除成功"); 46 47 ////6.目录移动:第一个参数:移动对象。第二个参数:路径加对象。 两个参数的路径必须存在,而且移动对象必须存在。 48 //Directory.Move(@"C:\a1.exe", @"C:\test\a1.exe"); 49 //Console.WriteLine("移动成功"); 50 51 //7.把一个文件夹当做一个对象来使用 52 DirectoryInfo directoryinfo=new DirectoryInfo(@"C:\test"); 53 //获取这个路径下的所以文件 54 FileInfo[] filelist= directoryinfo.GetFiles(); 55 foreach (var item in filelist) 56 { 57 Console.WriteLine(item); 58 } 59 ///获取这个路径下的所有文件夹 60 DirectoryInfo[] directoryinfos=directoryinfo.GetDirectories(); 61 foreach (var item in directoryinfos) 62 { 63 Console.WriteLine(item); 64 } 65 66 Console.ReadKey(); 67 } 68 } 69 }
获取当前exe文件执行的路径:
Assembly.GetExecutingAssembly().Location;
Application.StartupPath.
不要用:
Directory.GetCurrentDirectory();获取应用程序的当前工作目录。因为这个可能会变,通过使用OpenFileDialog或者手动设置Directory.SetCurrentDirectory()
做WinForm程序时会常用到。
1 //用相对路径读取的 2 //textBox2.Text = File.ReadAllText("allocationService.txt", Encoding.Default); 3 //用绝对路径读取 4 string exePath = Assembly.GetExecutingAssembly().Location.ToString(); 5 string txtPath=Path.Combine(Path.GetDirectoryName(exePath), "allocationService.txt"); 6 textBox2.Text = File.ReadAllText(txtPath, Encoding.Default);
操作文件(File)
产生乱码的原因(只有文本文件才会乱码):文本文件存储时采用的编码,与读取时采用的编码不一致,就会造成乱码问题。解决:采用统一的编码就ok.
文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding("GBK")
文件编码
ASCII:英文码表,每个字符占1个字节。:美国国家标准协会。
GB2312:兼容ASCII,包含中文。每个英文占一个字节(正数),中文占两个字节(负数)
GBK:简体中文,兼容gb2312,包含更多汉字。英文占1个字节(正数),中文占两个(1个负数,1个可正可负)
Big5:繁体中文
Unicode:国际码表,中文英文都站2个字节。
UTF-8:国际码表,英文占1个字节,中文占3个字节。
输出Encoding.GetEncodings(),所有编码。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace 编码问题 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //Encoding.Default表示采用计算机默认的“区域和语言选项”中的编码格式。 14 //由于我们使用的是计算机都是简体中文的,所以在计算机上默认新建的文本文件如果保存是编码显示为ANST,则表示简体中文 15 //string file = File.ReadAllText("1.txt",Encoding.Default); 16 //string file=File.ReadAllText("1.txt",Encoding.GetEncoding("gb2312")); 17 //Console.WriteLine(file); 18 19 //打印出所有的编码格式 20 EncodingInfo[]encodins= Encoding.GetEncodings(); 21 List<string> list = new List<string>(); 22 foreach (var item in encodins) 23 { 24 list.Add(item.CodePage + "\t" + item.DisplayName + "\t" + item.Name); 25 } 26 //存到1.txt上 27 File.WriteAllLines(@"d:\1.txt", list.ToArray()); 28 Console.ReadKey(); 29 } 30 } 31 }
什么是文本文件。拖到记事本中还能看得懂的就是文本文件,doc不是。
File类的常用静态方法:(FileInfo*)
void AppendAllText(string path, string contents),将文本contents附加到文件path中
bool Exists(string path)判断文件path是否存在
string[] ReadAllLines(string path) 读取文本文件到字符串数组中
string ReadAllText(string path) 读取文本文件到字符串中
void WriteAllText(string path, string contents)将文本contents保存到文件path中,会覆盖旧内容。
WriteAllLines(string path,string[] contents),将字符串数组逐行保存到文件path中,会覆盖旧内容。
File.Copy(“source”, “targetFileName”, true);//文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。
File.Exists();//判断文件是否存在
File.Move(“source”, “target”);//移动(剪切),思考如何为文件重命名?文件的剪切是可以跨磁盘的。
File.Delete(“path”);//删除。如果文件不存在?不存在,不报错
File.Create(“path”);//创建文件
操作文本文件
File.ReadAllLines(“path”, Encoding.Default);//读取所有行,返回string[]
File.ReadAllText(“path”, Encoding.Default);//读取所有文本返回string
File.ReadAllBytes(“path”);//读取文件,返回byte[],把文件作为二进制来处理。
===========================================
File.WriteAllLines(“path”, new string[4] ,Encoding.Default);//将string数组按行写入文件。
File.WriteAllText(“path”, “string”);//将字符串全部写入文件
File.WriteAllBytes(“path”,new byte[5]);//将byte[]全部写入到文件
File.AppendAllText()//将string追加到文件
快速得到文件流
FileStream fs=File.Open(); //返回FileStream
FileStream fs=File.OpenRead();//返回只读的FileStream
FileStream fs=File.OpenWrite();//返回只写的FileStream
FileStream fs=new FileStream(参数);
例子:判定这个目录是否存在。如果不存在创建
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace CreadPDFtxt { class Program { static void Main(string[] args) { string path = @"c:\11\33"; if (Directory.Exists(path))//判断是否存在 { Console.WriteLine("已存在"); } else { Console.WriteLine("不存在,正在创建"); Directory.CreateDirectory(path);//创建新路径 } File.Create(path+@"\dod.pdf"); File.Delete(path + @"\dod.pdf"); Console.Read(); } } }