.Net常用類庫 一、String成員方法(常用) 1,bool Contains(string str) 判斷字元串對象是否包含給定的內容 2,bool StartsWith(String str):判斷字元串對象是否以給定的字元串開始。 3,bool EndsWith(String str):判 ...
.Net常用類庫
一、String成員方法(常用)
1,bool Contains(string str) 判斷字元串對象是否包含給定的內容
2,bool StartsWith(String str):判斷字元串對象是否以給定的字元串開始。
3,bool EndsWith(String str):判斷字元串對象是否以給定的字元串結束。
案例:判斷是否是網址:以http://開頭、以.com或者.cn結尾。
案例:判斷用戶輸入的郵件是否是QQ郵箱,用戶輸入的用戶名是否包含“毛ze東”等敏感詞
4,int Length 獲取字元串的長度屬性
str.Length
5,char ch = str[3];
6,int indexOf(int ch) //返回指定字元在此字元串中第一次出現的索引
7,int indexOf(string str) //返回指定字元串在此字元串中第一次出現的索引
8,LastIndexOf //最後一次出現的位置
9,String Substring(int start) // 截取字元串,返回從指定位置開始截取後的字元串
10,String substring(int start,int length) // 截取字元串,返回從指定位置開始截取指定長度length的字元串
11,String ToLower() //把字元串變成小寫;
12,String ToUpper() // 把字元串變成大寫
13,String Replace(char oldChar,char newChar) //用新的字元去替換指定的舊的字元;
14,String Replace(string lodStr,string newStr) // 用新的字元串去替換指定的舊的字元串
15,String trim() // 去除字元串兩端的空格,
16,Trim(params char[] trimChars) // 去掉兩端的給定的字元
17,TrimEnd和TrimStrat //去掉開頭的和結尾的空格
18,String是不可變的,因此上面的操作都是生成新的字元串對象,要用返回值去接收新的字元串。
19,String[] Split() //重載方法很多,字元串按照分隔符切割。
案例:把字元串用“,”分割
二、String靜態方法
1,bool IsNullOrEmpty(string value) // 判斷字元串是否為null或者是空字元串
2,bool Euqals(string a,string b,StringComparison.OrdinallgnoreCase) //對兩個字元串進行不區分大小寫比較
3,string Join(string separator,params string[] value) // 把一個數組(集合)用分隔符separator連接為一個字元串
三、StringBuilder
因為字元串的不可變,在字元串進行連接的時候會產生新的字元串對象,造成浪費
1,Append();
StringBuilder sb = new StringBuilder();
sb.Append(s1);
sb.Append(s2).Append(s3);//因為Append方法把this對象(當前對象)返回了,所以可以鏈式編程
最後使用String s = sb.ToString(),一次性生成拼接結果字元串即可
2,AppendLine();
將預設的行終止符追加到當前 System.Text.StringBuilder 對象的末尾。(追加完,回車)
四、可空的int
int是值類型,不能為null。在C#中可以用int?表示“可空的int”
註意類型的轉換:
int? i = 5;
if(i!=null)
{
int i1 = (int)i;//需要進行強轉
}
也可以通過i.HasValue,判斷是都為null、i.value獲取i的值
通過IL可知,int?其實被編譯器翻譯為Nullable<int>類型
五、日期類型
DateTime類表示時間數據類型。屬於結構體,因此是值類型
DateTime.Now 當前時間,
DateTime.Today 當前日期
可以通過Year、Month、Hour的屬性得到日期的年、月、小時等部分;
也可以用構造函數根據給定的時間創建一個對象
六、異常的概念
異常發生在程式發生的不正常情況下。異常以一個異常類對象的形式拋出,異常類描述異常信息、發生的位置等。
異常的根類為Exception。異常類一般都繼承自Excrption
七、異常的捕捉
try
{
String s = null;
s.ToString();
}
catch(NullReferenceException ex)
{
Console.WriteLine("為空"+ex.Message);
}
ex就是發生異常的異常類對象,變數名只要不衝突就任意
在異常處理中,一旦try裡面有問題了。放棄try代碼塊中之後的代碼,直接跳到catch裡面執行。
如果try代碼後還有代碼,則處理完catch後還會繼續執行
八、多個異常的處理
try
{
int a = 10;
int b = 0;
Console.WriteLine(a/b);
int[] arr = {1,2,3};
Console.WriteLine(arr[3]);
}
catch(DivideByZeroException ae)
{
Console.WriteLine("除數不能為0");
}
catch(IndexOutOfRangeException ae)
{
Console.WriteLine("數組越界異常");
}
可以catch住父類異常,這樣就可以抓住所有子類異常了,但是強烈不建議這樣做,不要沒理由的catch異常
九、不要吃異常
catch(Exception ex)
{
//空代碼
}
不要只是把異常catch住什麼都不做或者只是列印一下,這不是正常的“異常處理”
不知道怎麼處理就不要catch,出錯比“把錯誤藏起來”好。這樣以為“不會出錯了”,其實是把異常“吃掉了”,會讓程式陷入混亂狀態
要合理的處理異常
十、finally
try
{
//有可能有問題的代碼
}
catch(異常類型 異常變數)
{
//處理方式
}
finally
{
//無論是否出現異常,都要執行的代碼
}
finally中一般進行資源的回收等。
十一、File文件類
File是靜態類(無法被New),其主要的靜態方法有:
1,void Delete(string path) 刪除文件
2,bool Exists(string path) 判斷文件是否存在
3,string[] ReadAllLines(string path) 將文本文件中的內容讀取到string數組中
4,string ReadAllText(string path) 將文本文件讀取為一個字元串
5,void WriteAllLines(string path,string[] contents) 將string[]寫入到文件中
6,void WriteAllText(string path,string contents) 將字元串contents寫入到文件path中
7,AppendAllText 向文件中附加內容
8,Copy 複製文件
9,Move 移動文件
十二、Directory文件夾類,為static類
1,CreateDirectory(string path) 創建文件夾全路徑
2,void Delete(string path,bool recursive)
刪除文件夾path,recursive表示是否也刪除子文件及子文件夾。
如果文件夾不為空,recursive=false,則拋異常
示例代碼:Directory.Delete(@"全路徑", true);
3,boolExists(string path) 判斷文件夾是否存在
4,Directory.EnumerateFiles(); 返回指定路徑中的文件名的可枚舉集合。
5, Directory.EnumerateDirectories(); 返回指定路徑中與搜索模式匹配的目錄名稱的可枚舉集合。
十三、流 Stream
1,File類提供了讀寫文本文件的方法,但是對於大文件不能用它提供的方法,太占記憶體,需要一種“流式處理”的方法
2,.Net將IO操作(文件、網路等)簡化成流模型Stream,是抽象類,
網路、文件、加密稍等都是不同的子類,
最常用的子類是FileStream、MemoryStream等
3,使用Stream的時候雖然可以:
FileStream fs = new FileStream();
但是,Stream fs = new FileStream();更好!
在使用的變數類型提供的操作能滿足的前提下,儘可能的用父類、介面聲明變數,(體現了多態的思想),
4,FileStream寫入文件
FileStream fs = new FileStream(@"D:\1.txt", FileMode.Create);//創建一個文本文件
byte[] bytes = Encoding.Default.GetBytes("你好如鵬網");//將“你好如鵬網”進行編碼成byte數組對象
fs.Write(bytes, 0, bytes.Length);//操作fs對象進行寫入
fs.Close();//關閉流
Stream寫入的單位是byte(位元組),char轉換為byte時候,一個英文char轉換為一個byte(對應的ASCII碼),一個中文char轉換為兩個byte
採用Default、UTF8、UTF32得到的字元串的byte[]長度不一樣,因此說明不同類型編碼在電腦中存儲的不一樣。
用什麼編碼寫入就用什麼編碼讀取,否則會有亂碼的問題。
註意:不要往C盤寫,因為Win7、Win8預設普通程式沒有許可權讀寫C盤
5,FileStream讀取
1,byte[] bytes = new byte[4];
每次讀取多個位元組數據,不能一次把一個文件讀取出來,否則太占用記憶體,因為數組是占用記憶體的。
這個叫做“緩衝區”,設的太小CPU和硬碟會很忙,設的太大記憶體會很“撐”
2,while((len = fs.Read(bytes,0,bytes.Length))>0) 繼續從流中讀取最多bytes長度那麼多位元組的數據拷貝到bytes數組中。
下次read是從上次最後一個read最後的位置之後開始讀,一次次的讀取read方法返回這次一共讀了多少位元組(比如遇到最後一次讀取可能讀不滿),
一旦返回的=0了,就說明讀完了。
對於沒被賦值初始值就是0,因為沒被填滿的數組位置是0.
3,String s = Encoding.Default.GetString(bytes,0,len); 把byte[]轉換成對應string,考慮bytes沒有充分利用的情況
4,位元組流不適合讀取內容中包含文本文檔,容易造成數據錯亂(byte[]中含有一半的漢字)。
要用後面講的StreamReader
十四、資源的關閉
1,在上面的程式有缺陷,如果write的時候發生異常,fs就不會close,其他程式就無法寫入這個文件了,也會占用資源
2,資源要使用完畢才能close,一旦close之後再操作就會出錯
3,正確是做法是放在using(){}裡面
十五、using
1,可以同時聲明多個資源
using(MyFile f1 = new MyFile())
using(MyFile f2 = new MyFile())
{
}
2,using其實就是編譯器簡化的try。。finally操作,
3,using只是try。。finally,如果需要catch,只管catch就是了
4,註意:實現了IDisposable介面的對象用完了,都要Dispose
十六、複製文件
1,使用兩個FileStream配合完成文件拷貝:
從源文件的FileStream中讀取一部分內容,再寫入到目標文件的FileStream中。
解釋代碼:
1,while((len = inStream.Read(bytes,0,bytes.Length))>0)
把讀取並且返回讀取的長度給len,然後判斷len的值,綜合為了一句話。
2,outStream.Write(bytes,0,len);
每次write都會從上次write的最後位置接著寫入。將byte[] 數組b寫入outStream中,off代碼距離當前寫入位置的偏移量,一般寫0,len代表寫入多長。
緩衝區先設置50,,修改為1M,體會速度的變化。使用StopWatch類進行代碼計時。
2,封裝一個Copy方法
封裝一個函數void copy(Stream inStream,Stream outStream,int bufferSize)用來把inStream拷貝到outStream中,
緩衝區大小為bufferSize。要檢查參數合法性(是否為null、bufferSize是否在合理範圍)
3,.Net 4.0之後Stream類中提供了一個CopyTo方法
4,Reader、Writer(文本內容)
直接用Stream進行文本文件的讀寫會比較麻煩,因為需要考慮文件的編碼、中文字元等的問題
StreamReader、StreamWriter是用來讀寫字元流(characterstream)的類,會幫著自動處理麻煩的問題
十七、編碼
1,由於歷史原因,漢字等如何在電腦中以位元組存儲存在著多種標準,最常見的是GB2312(國家標準、表示漢字)、
GBK(GB2312的擴展,還能表示繁體字等)、UTF-8(國際標準)、UTF-16等
2,ANSI表示採用當前操作系統的預設編碼,如果是中文Windows,預設就是GBK
3,用什麼編碼保存就用什麼編碼讀取,就不會亂碼
4,如何用其他編碼保存?由StreamWriter構造函數決定:new StreamWriter(outStream, Encoding.UTF8
怎麼初步判斷用了什麼編碼?記事本打開另存為,可以看到
5,讀取的編碼由StreamReader構造函數決定
十八、泛型容器List<T>
1,數組長度是固定的,List<T>可以動態增刪內容。
List<T>是泛型的,可以在聲明的時候指定放什麼類型的數據。
2,如何增加
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.AddRange(new int[]{1,2,3,4,5});
list.AddRange(list2);//添加另外一個list
3,如何遍歷
int[] nums = list.ToArray();//List泛型集合可以轉換為數組
List<string> listStr = new List<string>();
string[] str = listStr.ToArray();
十九、泛型字典Dictionary<Key,Value>
1,如何增加
Dictionary<string,string> dict = new Dictionary<string,string>();
dict.Add("zs","張三");
dict.Add("ls","李四");
dict.Add("ww","王五");
2,如何修改
dict["ls"] = "小趙";
String s = dict["ww"];
3,判斷是否包含
dict.ContainsKey();
二十、foreach
1,除了使用for迴圈可以進行遍歷外,實現了IEumerable介面的對象還可以使用foreach進行遍歷
string[] strs = {"asdasd","qweqweq","gdfg"};
foreach(string s in strs)
{
Console.WriteLine(s);
}
2,List<T>、Dictionary<K,V>等一切實現了IEnumerable介面的對象都可以進行遍歷
Dictionary<string,object> dict = new Dictionary<string,object>();
dict["rupeng"] = 888;
dict["sina"] = "hehe";
dict["baidu"] = true;
foreach(KeyValuePair<string,object> kv in dict)
{
Console.WriteLine(kv.Key+"="+kv.Value);
}