如鵬網學習筆記(四).Net常用類庫


.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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM