一、概念類
①、什麼是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