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 }
Path类的方法例子

操作目录(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 }
练习Directory时写的

获取当前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);
补充例子:相对路径vs绝对路径

操作文件(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();
        }
    }
}
View Code

 

 

posted @ 2013-07-23 00:37  偏执的放纵  阅读(283)  评论(0编辑  收藏  举报