• 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: empF3.png", "jpg")
    string Combine(string path1, string path2)
    将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题
    string s = Path.Combine(@"c: emp","a.jpg")
    string GetDirectoryName(string path) (*)
    得到文件的路径名。Path.GetDirectoryName(@"c: empa.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:acd.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:	estcreatedirectory");
    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:	est";
    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:	esta1.exe");
    49             //Console.WriteLine("移动成功");
    50 
    51             //7.把一个文件夹当做一个对象来使用
    52             DirectoryInfo directoryinfo=new DirectoryInfo(@"C:	est");
    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 + "	" + item.DisplayName + "	" + 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:1133";
                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
  • 相关阅读:
    线程的中断.interrupt
    线程的加入.join()
    Runnable接口
    线程Thread类
    求和、均值
    最值、对应索引位置
    数组、冒泡排序
    获取Methods成员方法类
    获取Field成员变量类
    基于WinDbg的内存泄漏分析
  • 原文地址:https://www.cnblogs.com/huijie/p/3207771.html
Copyright © 2020-2023  润新知