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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章