C#之基础3---⑤(Stream(流)、Directory、重写、重载、虚方法、抽象方法、多态、设计模式、接口、拆装箱、序列化)

一、概念类

①、什么是Stream流,什么情况下用Stream流?

Stream(流),类Stream为抽象类,需要引入命名空间: using System.IO,其中类Stream为抽象类,由此有三个派生类: 
MemoryStream:对内存进行读取与写入 
BufferedStream:对缓冲器进行读取/写入 
FileStream:对文件执行读取与写入 
TextReader/Writer为抽象类。由此派生类: 
StreamReader/StreamWirter 
StringReader/StreamWriter 

为什么引入文件流:读取大文件时,无法一下子传送过去,只能一点一点的读取,这就好比水龙头流水一样,我要接一桶水,要水管一点一点的放入。当接满后(读取完后)要关闭水管(文件流),把文件流代码放入using( )括号内,using可自动释放资源。

②、什么是Directory?什么时候用?如何用?

Directory类位于System.IO命名空间,Directory类提供了在目录和子目录中进行创建移动和列举操作的静态方法。此外,Directory还可以访问和操作各种各种的目录属性。我个人善于把它理解为文件件的操作。

一般对文件夹进行操作时使用,Directory属于静态类,所以直接  “  .  ”调取方法。

③、什么是子类,什么是父类,如何理解面向对象的继承性?

       子类父类的名词来自对象的三个特征中的继承性,如果一个类A“继承自”另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”。

       继承性子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。 

④、什么是重写,什么是重载,区别是什么?

        重写(override):子类重写父类中的方法,不管父类中是虚方法还是抽象方法,子类都可重写。

        重载(overload):重载是方法的名称相同,参数或类型不同,进行多次重载以适应不同的需要。

区别: 重写:子类重写写父类的方法,面向对象。

            重载 :为方法添加不同参数不同类型的内容,面向过程。

⑤、什么是虚方法,什么是抽象方法,什么是抽象类,虚方法与抽象方法的异同?

        虚方法(Virtual):当类中的方法声明前加上了Virtual修饰符,我们称之为虚方法,反之为非需。使用了virtual修饰符后,不允许再有static,abstract,override修饰符;虚方法有内容。

        抽象方法(Abstract):在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法。抽象方法一般存在与抽象类或接口中。

        抽象类:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。在编程语句中用abstract修饰的类是抽象类,抽象类是不完整的,它只能用作基类,抽象类不能实例化。

        虚方法与抽象方法的区别:

⑥、什么是多态?干什么用的?什么时候用?

       多态就是对象可以表现多个类型的能力。同一操作作用于不同的对象(比如:叫),可以有不同的解释,产生不同的执行结果(狗:汪汪叫,猫:喵喵叫...)

      简单工厂设计模式,核心就是多态。

⑦、什么是设计模式?

       世上本无路,走的人多了便形成了路。世上本无设计模式,遇到的问题多了,总结出了遇到一些项目用哪些方式解决了。设计模式:软件开发过程中的经验积累。特定问题经过实践检验的特定解决方法。

⑧、什么是接口?接口特点?实现接口与显示接口的区别?

       接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。接口可有方法、属性、事件和索引器或这四种成员的任何组合类型,但不能包含字段。

       接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员(说明:如类A继承接口B,那么A中必须实现B中定义的属性和方法等),接口就是用来实现的。

⑨、什么是装箱、拆箱?作用?

        装箱:将值类型将数据项从栈内存自动复制到堆内存的行为。

        拆箱:将引用类型转换为值类型。

        作用:利用装箱和拆箱功能,可通过允许值类型的任何值与Object类型的值互相转换,将值类型与引用类型链接起来。

        

⑩、抽象类(abstract class)和接口(interface)有什么区别?

相同点:

都没有方法体,都不能被实例化,都可以通过继承实现期抽象方法。

不同点:

接口支持多实现,抽象类不能实现多继承。

接口只能定义行为,抽象类既可以定义行为,还可能提供实现。

 

 

 ⑪、序列化作用?为什么要有序列化?

当我们从控制台内读取内容时,读取出来的都是字符串,我们想要用不同类型的内容还需要进行转换,那样会很麻烦,那有没有什么办法可以让存入的时候就是不同的类型,取出的时候也是不同的类型取出呢,应这种需求便有了序列化,把不同类型的内容存储在类的属性里。

序列化和反序列化,我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。

二、代码类

①、Stream(流)的读取与写入

        static void Main(string[] args)
        {                                                  
            string path = @"C:\Users\Smile\Desktop\1.txt"; //创建读取文件的路径
                                                           //文件流的读
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                                                           //寻找路径,打开方式,打开后操作(读,写),
                                                           //使用using不用考虑是否关闭文件流,是否释放资源,using里面自动释放资源
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.Default))
                {
                //bool result = sr.EndOfStream;           //是否读到文件末尾
                //Console.WriteLine(sr.ReadLine());       //只读取文本文档的第一行
                //Console.WriteLine(sr.ReadToEnd());      // 从头到尾的读取
                //从头读到末尾的另一种方法
                    while (!sr.EndOfStream)                //判断是否到文件流末尾
                    {
                        Console.WriteLine(sr.ReadLine());  //如果没有到末尾继续读
                    }
                }
            }
             //文件流的写
            using (FileStream fs = new FileStream(path, FileMode.Open,FileAccess.Write,FileShare.Write))
            {
                using (StreamWriter sw = new StreamWriter(fs,Encoding.Default))
                {
                    sw.Write("哈哈哈");
                }
            }
            Console.ReadKey();   

②、Directory(目录\文件夹)的使用

 static void Main(string[] args)
        {
            string path = @"C:\Users\Smile\Desktop\1";
            Directory.CreateDirectory(path);                    //①、 创建文件夹   在指定路径下创建一个文件夹,如果文件夹内有东西再创建时不报异常
            Directory.Delete(path);                             //②、 删除文件夹   在指定路径下删除一个文件夹,如果文件夹内有内容则报异常,除非用Delete的第二个重载。
            bool result = Directory.Exists(path);               //③、判断指定路径path下有没有路径中文件夹1
            string[] dir = Directory.GetDirectories(path);      //④、获取当前路径下的所有文件夹路径
            for (int i = 0; i < dir.Length; i++)
            {
                Console.WriteLine(dir[i]);
            }

            string[] stri = Directory.GetFiles(path);           //⑤、获取当前路径下这个文件夹下所有文件的全路径,不包含文件夹
            for (int i = 0; i < stri.Length; i++)
            {
                Console.WriteLine(stri[i]);
            }
            string str = Directory.GetCurrentDirectory();       //⑥、获取当前程序所在目录
            Console.ReadKey();
        }

③、装箱、拆箱代码

        static void Main(string[] args)
        {
            //装箱:将值类型、将数据项从内存中自动复制到堆内存中的行为
            int num = 10;                      //值类型
            object obj = num;                  //值类型num内容赋值给引用类型obj
            Console.WriteLine(obj);
            Console.ReadKey();

            //拆箱:将引用类型转换为值类型
            int num = 10;
            object obj = num;
            int number = (int)obj;            //引用类型强制转换为值类型
            Console.WriteLine(number);
            Console.ReadKey();
        }

④、序列化

    class Program
    {
        static void Main(string[] args)
        {
            #region 序列化(写):多个类型的存值
            Person p = new Person("张三", '男', 18);                //实例化一个类,并向对象赋值
            string path = @"C:\Users\Smile\Desktop\1.txt";          //建立一个路径
                                                                    //步骤一:创建流
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Write))
            {
                BinaryFormatter bf = new BinaryFormatter();         //步骤二:创建一个二进制序列化器
                bf.Serialize(fs, p);                                //步骤三:对对象p进行序列化
            }
            Console.WriteLine("序列化成功");
            Console.ReadKey();
            #endregion

            #region 反序列化(读):多个类型取值
            Person p ;                                              //实例化一个类
            string path = @"C:\Users\Smile\Desktop\1.txt";          //建立一个路径
                                                                    //步骤一:创建流
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                BinaryFormatter bf = new BinaryFormatter();         //步骤二:创建一个二进制序列化器
                p=(Person)bf.Deserialize(fs);                       //步骤三:对对象p进行反序列化
            }
            Console.WriteLine("反序列化成功");
            Console.WriteLine(p.Name);                              //在控制台上写入对象的名称,类型为字符串
            Console.WriteLine(p.Age);                               //在控制台上写入对象的年龄,类型为整数型
            Console.WriteLine(p.Sex);                               //在控制台上写入对象的年龄,类型为字符型
            Console.ReadKey();
            #endregion
        }
    }

    [Serializable]                                                  //前提:序列化的时候要在类的前面做标记,告知序列化
    public class Person

⑤、异常处理

        static void Main(string[] args)
        {
            Console.WriteLine("请输入数字");
            
            try                                     //判断是否异常语句try catch语句
            {
                int number = Convert.ToInt32(Console.ReadLine());
            }
            catch (Exception ex)                    //Exception 是一个类,所以要实例化一个类,对象ex
            {
                Console.WriteLine(ex.Message);      //专业的错误提示信息
            }
            Console.ReadKey();
        }

三、拓展(很棒的文章)

①、多态的法力

https://www.cnblogs.com/weiguangyi/p/5237289.html

②、接口拓展

https://www.cnblogs.com/hamburger/p/4681681.html

③、序列化和反序列化

https://www.cnblogs.com/shenbing/p/5142241.html

以上便是第三部分第五讲的内容梳理,下一站设计模式、窗体走起O(∩_∩)O~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值