泛型集合
List
List<int> list = new List<int>();
Dictionary<Tkey, Tvalue>
Dictionary<int, string> dic = new Dictionary<int, string>()
兩者都不會發生裝箱和拆箱的問題,因為他們裡面裝的元素都是同類型的
他們添加數據的方法
- Add方法
dic.add(1,"張三")加入相同的key會拋異常 - 依據key
dic[1]="張三";加人相同的key不會拋異常,只會覆蓋原來的值
遍歷元素的方式
KeyValuePair<type, type>
1
2
3
foreach (KeyValuePair<int,string> kv in dic){
Console.WriteLine($"key: {kv.Key}, value: {kv.Value}");
}
文件流 FileStream、StreamReader、StreamWrite
FileStream
操作位元組Byte,意味著可以操作所有類型的文件,可以用來處理大文件。
寫在using{}裡面,可以幫我們
- 關閉stream
- 釋放stream所占的資源
範例:FileStream 讀取文件
FileMode最好使用OpenOrCreate避免拋異常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//FileMode.OpenOrCreate: 如果沒有檔案就建立,避免拋異常
using (FileStream fsRead = new FileStream(@"C:\Users\rivalin\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
//它讀的時候是放在一個byte[]裡面
byte[] buffer = new byte[1024 * 1024 * 5];
//本次實際讀到的byte[]數
//如果這邊是大數據的話,就要用循環來做
int r = fsRead.Read(buffer, 0, buffer.Length); //把讀到的放進buffer,從頭開始讀,所以是0,讀的長度為buffer.Length
//將位元組byte[]中的每一個元素,按照我們指定的編碼格式解析成字串
string s= Encoding.Default.GetString(buffer, 0, r); //從頭開始解,所以是0,解碼r個
Console.WriteLine(s);
}
範例:FileStream 寫入文件
使用FileMode.OpenOrCreate寫入會覆蓋內容,不想被覆蓋,可以用FileMode.Append它會追加在內容最後面。
1
2
3
4
5
6
7
8
9
using (FileStream fsWrite = new FileStream(@"C:\Users\rivalin\Desktop\new.txt", FileMode.Append, FileAccess.Write))
{
string s = "今天要學習好多好多東西哦…";
//fsWrite在寫入的時候,是寫入byte[],所以要先把字串轉成byte[]
byte[] buffer = Encoding.Default.GetBytes(s);
fsWrite.Write(buffer, 0, buffer.Length);
Console.WriteLine("done");
}
FileStream 是必須要掌握的
StreamReader, StreamWrite
操作字元的,只能操作文本文件(txt)
File
用來處理小文件
拆裝箱
裝箱:將值類型轉換為引用類型
(是給值類型的引用類型)拆箱:將引用類型轉換為值類型
(是給引用類型的值類型)
1
2
3
int n = 10;
object o = n; //裝箱,將值類型 轉換為引用類型
int nn = (int)o; //拆箱,將引用類型 轉換為值類型
我們應該避免在程式碼中發生裝箱或者拆箱。
它們影響的是時間,程式碼要避免拆裝箱,
怎麼判別?看他們有沒有繼承關係
多態
多態是什麼?
多態就是為了讓一個對象能夠表現出多種狀態、多種類型。
- 虛方法 virtual (virtual, override) 父類方法有實現
- 抽象方法 abstract (abstract, overrid) 父類方法不能實現
- 介面
什麼時候用虛方法?
方法裡面有實現的時候
練習:虛方法和抽象類
老師可以起立,學生也可以起立,校長也可以起立
用多態來實現”起立”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//聲明父類去指向子類對象
Person p = new HeadMaster();//new Teacher();//new Student();
//調的依然是父類的StandUp()方法,
//但是這個方法己經被子類重新寫過,
//所以最終執行的是子類的方法
//但是最終執行的是哪一個子類的方法,
//取決於你裝的是誰的子類
p.StandUp();
Console.ReadKey();
//父類
//因為有抽象方法,所以類別只能是抽象類別,因為它不完整,所以不能產生物件使用
public abstract class Person {
//因為每個人起立的方式不同,所以使用抽象去定義方法,讓子類重寫它
public abstract void StandUp();
}
//子類
public class Student : Person {
public override void StandUp() {
Console.WriteLine("學生起立,說老師好");
}
}
public class Teacher : Person {
public override void StandUp() {
Console.WriteLine("老師起立,說校長好");
}
}
public class HeadMaster : Person {
public override void StandUp() {
Console.WriteLine("校長起立,說領導好");
}
}
R Note
FileStream, StreamReader, StreamWrite
FileStream, StreamReader, StreamWrite是用來處理大文件的,他們的區別是什麼?
- FileStream 是操作byte[]的,所以可以用來處理任何類型文件。本文、影音、圖片…
- StreamReader, StreamWrite可以看作是一組,用來操作字元的,所以只能用來處理文本的(txt)
File 是用來處理小文件的
什麼時候用虛方法?(父類virtual,子類override)
父類方法有實現(方法裡面有實現的時候)
什麼時候用抽象方法?(父類abstract,子類override)
父類方法沒有實現(方法裡面沒有實現的時候)
為什麼父類方法沒有實現?因為不能定義,也不知道怎麼去定義,就不用定義,讓子類繼承的時候去重寫這個方法就好了。
多態是什麼?
多態就是為了讓一個對象能夠表現出多種狀態、多種類型
寫多態的好處是什麼?
- 減少程式碼
- 尋找各各子類間的差異,寫出通用的程式碼
裝箱&拆箱
- 裝箱:將值類型 轉換為 引用類型
- 拆箱:將引用類型 轉換為 值類型
1
2
3
int n = 10;
object o = n; //裝箱
int nn = (int)o; //拆箱
怎麼判別有沒有裝拆箱?
看他們有沒有繼承關係。
後面用比較多是抽象類