只要實現了該接口,就可以使用foreach進行遍歷。foreach循環的本質就是調用這個接口返回一個迭代器,調用迭代器的MoveNext()方法就可以實現循環。
源碼:
{ IEnumerator GetEnumerator(); //返回一個迭代器} public interface IEnumerator{ bool MoveNext(); object Current { get; } void Reset();}以上不難看出:
IEnumerable接口中主要包括GetEnumerable方法(獲取迭代器對象),MoveNext方法(檢查是否存在循環的下一個元素),GetCurrent方法(獲得當前循環到的元素)
集合就是能裝一堆東西的容器。主要分為非泛型集合和泛型集合
ArrayList——里面真正存儲數據的是一個Object[]數組,它對應的泛型是List<T>
HashTable——非泛型的鍵值對集合,它對應的泛型是Dictionary<TKey,TValue>
動態數組對元素沒有任何約束,想添加什么都可以。其根本原因是因為其內部存儲數據的是一個Object類型的數組。
泛型集合是帶元素類型約束的集合(對添加里面的元素有一個約束)
泛型集合避免了裝箱、拆箱操作帶來的性能損耗,在添加元素時參數類型進行檢查
add(), AddRange(), Insert(), InsertRange(), remove(), removeAt()
Reverse()——將集合中的元素反轉
HashTable,鍵值對集合,其內部是一個結構體數組bucket[]。有三個東西:鍵、值、鍵的哈西碼
數據主要存儲于:PRivate bucket[] buckets;
private struct bucket{ public object key; public object val; public int hash_coll;}存取操作:
存儲的原理:下標是根據key的hash值算出來的。當我們向HashTable中Add元素時,元素儲存在HashTable的數組里的下標是根據添加的Key的hash值算出來的(但因為hash值取模數組長度,所以肯定不會超過當前數組長度)。
每個對象算出來的Hashcode并不是唯一的。有可能出現多個對象的HashCode相同。解決機制:
a、再次hash一次
b、桶裝模式,將兩個相同hashcode的對象裝入統一個位置
c、當新增時,HashTable里的容器數組已經滿了,則以數組的兩倍擴容
取值原理:當我們從HashTable里取元素時(根據key來取),會根據key的hash值算出要取的元素的下標,并比較元素里的key和當前要找的key參數的hash值是否相等,同時還要比較兩個key的引用是否一致。如果都滿足,則確定找到要取的元素。
引用名稱空間:System.Collections.Generic
List<T>——T是存儲的類型
Dictionary<K,V>
ArrayList存值類型需要裝箱猜想,而存儲引用類型需要類型轉換,而List<T>很明顯不需要這些額外的開銷,高性能顯而易見
網絡操作(套接字),文件操作(IO相關),數據庫操作,除法操作(除數為0的時候),強制類型轉換操作
designer.cs設計類和前臺兩個類是兄弟類的關系(partial)
ChangeExtension(修改文件的后綴,“修改”支持字符串層面的,沒有真的給文件改名)
Combine——將兩個路徑合成一個路徑【自動處理路徑分隔符的問題】
GetDirectoryName——得到文件的路徑名
GetExtension——得到文件的擴展名
GetFileName——得到文件路徑的文件名部分
GetFileNameWithoutExtension——得到去除擴展名的文件名
GetFullPath——得到文件的全路徑,可以根據相對路徑獲得絕對路徑
GetTempFileName——得到一個唯一的臨時文件名
GetTempPath——得到臨時文件夾的路徑
…………
Delete——刪除目錄【recursive表示是否遞歸刪除】
Exists——判斷目錄是否存在
move——移動
GetDirectories+得到一個目錄下的子目錄
GetFiles——得到一個目錄下的文件
…………
File——操作文件、靜態類,對文件整體操作。拷貝、刪除。剪切等
AppendAllText——將文本contents附加到文件path中【如果文件不存在,則創建】
Exists——判斷文件path是否存在
ReadAllLines——讀取文本文件到字符串數組中
ReadAllText——讀取文本文件到字符串中
WriteAllText——將文本contents保存到文件path中,會覆蓋舊內容
Copy——文件拷貝【true表示當文件存在時“覆蓋 ”,如果不加true,文件存在時則報異常】
Create——創建文件
Delete——如果文件不存在則報錯
DirectoryInfo——文件夾的一個“類”,用來描述一個文件夾對象
GetParent——得到目錄的父目錄
FileInfo——文件夾,用來描述一個文件夾對象
需要注意:
獲取當前exe文件執行的路徑用 Assembly.GetExecutingAssembly().Location ,不要用Directory.GetCurrentDirectory() ,因為獲取的是程序當前工作目錄,這個路徑可能會變
修改文本編碼通過GetEncoding獲得該編碼
FileStream——任意類型
StreamWriter——字符串寫
StreamReader——字符串讀
本質是一個try{……}finally語句塊
所有要使用Using關鍵字來釋放資源的類必須實現IDisposable接口
Close執行了Dispose()并回收對象
使用Using語句塊并不能抓住異常,因為Using里面只做了 try……finally操作,并沒有catch語句塊,所以在using語句塊中還要自己加上try……catch塊來捕捉異常
Serialization特性
二進制格式化器
序列化:二進制格式化器,將對象里的字段及值以“文本”的方式保存成文本
[Serializable]
BinaryFormatter類方法
Serialize——對象graph序列化到stream中
Deserialize——將對象從stream中發序列化,返回值為反序列化得到的對象
序列化需要注意的:
a、呀序列化的類型必須標記為:[Serializable]
b、該類型的父類也必須標記為:[Serializable],反射的時候有一個參數必須是“是否尋找父類對象”
c、該類型中的所有成員的類型也必須標記為:[Serializable]
d、序列化只會對類中的字段序列號(只能序列化一些狀態信息)
反序列化:二進制格式化器,先創建一個相同的對象,然后見“文本”里保存的字段的值設置到字段中。按照文本(字段、字段值、類名)信息里的類名,使用反射技術創建新對象,并將對一個字段的值設置到新的對象中
新聞熱點
疑難解答