C#學習筆記(六)

1、Path類

    在System.IO命名空間中,是一個靜態類。用來對路徑信息進行操作的類。尤其當我們處理文件的時候非常有用。

string str=@"C:\Users\Administrator\Desktop\1.txt";
Path.GetFileName(str);//獲得文件名1.txt
Path.GetFileNameWithoutExtention(str);//獲得沒有擴展名的文件名,1
Path.GetExtention(str);
Path.GetDirectoryName(str);
Path.Combine(@"C:\","b.txt");//合成文件路徑
Path.GetFullPath(str);

2、編碼

    將字符串以什麼樣的形式保存爲二進制,這個就是編碼,常用的有UTF-8(主要用於Web應用中)、ASCII、Unicode(比較通用的一種編碼格式)、gbk。

    產生亂碼的原因:保存文件所使用的編碼格式,與打開文件所使用的編碼格式不一致。

3、File類

    也在System.IO類中,是一個靜態類。

File.Create(@"C:\Users\Administrator\Desktop\1.txt");
File.Delete(@"C:\Users\Administrator\Desktop\1.txt");
File.Copy();

//文件讀取
byte[] buffer=File.ReadAllBytes(@"");//將文件一次性讀到buffer中
string s=Encodeing.Default.GetString(buffer);//將buffer中的字符數組按照默認的編碼格式轉換爲String字符串
//文件寫入
string str="你好";//待寫入字符串
byte[] buffer=Encoding.Default.GetBytes(str);//按照默認的編碼格式將字符串轉換爲byte數組
File.WriteAllBytes(@"",buffer);//將buffer中的數組寫入指定文件中
//以每一行讀取文件
string[] contents=File.ReadAllLines(@"",Encoding.Default);
foreach(string item in contents)
{
   Console.WriteLine(item);
}
//讀入全文本
string str=File.ReadAllText(@"",Encoding.Default);
//與此對應的是
File.WriteAllLines();
File.WriteAllText();

注:以字節byte數組讀寫數據的方式可以讀寫任何類型的文件,因爲所有文件的存儲都是以字節的方式存儲的,而後面幾種方式只能讀取文本文件。

注:File只能讀取小文件,因爲其每次都是一次性把所有數據都讀進來,這種方式對內存來說負荷很大,所以應付小文件還OK。對於大文件還是推薦使用文件流

4、文件流

    文件流包括三種:FileStream、StreamReader、StreamWriter。其中FileStream是操作字節的,而後兩個是操作字符的,因此FileStream可以用來操作任何類型的文件,而StreamReader和StreamWriter只能用來操作文本文件。

//讀數據
FileStram fsread=new FileStream(@"",FileMode.方式,FileAccess.Read);//按照指定的方式打開指定的文件
byte[] buffer=new byte[1024*1024*5];//開闢一塊5M的buffer用來讀取數據
int r=fsread.Read(buffer,0,buffer.Length);//從指定的文件中把0到buffer.Length字節長度的數據讀到buffer中
string s=Encoding.Default.GetString(buffer,0,r);//將buffer中實際長度的數據按照默認的編碼格式轉換爲string
fsread.Close();//關閉流
fsread.Dispose();//釋放流所佔用的資源

//在上述過程中,最後我們需要關閉流並且釋放流所佔用的資源,我們可以使用using語句來幫助我們做這件事
//只要把開闢流以及使用流的過程都放到using語句中,就不用每次都要Close和Dispose了
//寫入數據
using(FileStream fswrite=new FileStream(@"",FileMode.OpenOrCreate,FileAccess.Write))
{
     string str="你好";
     byte[] buffer=Encoding.Default.GetBytes(str);
     fswrite.Write(buffer,0,buffer.Length);
}
//這裏就不用再Close和Dispose了
注意:在讀取和寫入文件時的編碼格式一定要統一,否則會亂碼。

5、裝箱和拆箱

    裝箱:將值類型轉換爲引用類型;

    拆箱:將引用類型轉換爲值類型;

ArrayList list=new ArrayList();
for(int i=0;i<1000000;i++)
{
    list.Add(i);
}
//上述就發生了1000000次裝箱過程,每一次裝箱過程都會降低程序效率,因此在程序中一般儘量避免發生裝箱和拆箱行爲

注:看兩種類型是否發生裝箱或拆箱,要看這兩種類型是否存在繼承關係,若沒有繼承,則有可能發生裝箱和拆箱,若沒有繼承,則一定沒有發生裝箱和拆箱,兩種類型有繼承關係,說明他們的內存有可能有交集。因此我們較少使用ArrayList集合,而是使用List泛型集合

6、List泛型集合

List<int> list=new List<int>();
list.Add(1);
list.Add(3);
list.Add(5);
....
for(int i=0;i<list.Count;i++)
{
   Console.WriteLine(list[i]);
}
    由於在定義時已經指定了類型,因此在上述for循環中並沒有進行裝箱或拆箱操作。

   注:List泛型集合可以和數組相互轉換,利用ToArray,ToList。

7、字典:Dictionary

    List集合對應的是ArrayList,Dictionary對應的就是鍵值對集合。

Dictionary<int,string> dic=new Dictionary<int,string>();
dic.Add(1,"張三");
dic[1]="李四";//可利用這種訪問方式修改值
foreach(var item in dic.Keys)    //根據鍵遍歷值
{}
foreach(KeyValuePair<int,string> kv in dic)    //同時遍歷鍵和值
{kv.value;   kv.Key;}

8、多態

    讓一個對象表現出多種類型。實現多態有三種方式:

  • 虛方法

    將父類的方法標記爲虛方法:virtual,然後子類重寫該方法:override。

  • 抽象類

    當父類中的方法不知道如何去實現的時候,可以考慮將父類寫成抽象類,方法寫成抽象方法,使用關鍵字abstract,子類也是用override來修飾,表示重寫。

注:抽象類不允許創建對象,只能放子類對象。

抽象類和虛方法的區別:抽象類中的方法沒有實現,虛方法中有實現。

    如果子類繼承的是抽象類,那麼子類必須要實現父類當中所有抽象成員。抽象成員只能出現在抽象類中,不能出現在非抽象類中,抽象成員的訪問修飾符不能使private。抽象類是有構造函數的,雖然不能被實例化。

NOTE:如果父類中的方法有默認的實現,並且父類需要被實例化,這時可以考慮將父類定義成一個普通類,用虛方法實現;如果父類中的方法沒有默認實現,父類也不需要被實例化,則可以將該類定義爲抽象類。

9、C#中的修飾符

    C#中只有五種修飾符:public、private、protected、internal、protected internal。

其中internal只能在當前項目中訪問,在當前項目中,internal和public的權限是一樣的。

注:

1)、class的默認修飾符是internal,能夠修飾類的只有兩個:internal和public

2)、子類的訪問權限不能高於父類的訪問權限,否則會暴露父類的成員。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章