c#學習總結

1、語句
語句是c#中的一句話,通常以分號結束。
語句有條件語句和循環語句。
條件語句有if  switch
循環語句有whiledo。。。whileforforeach。值得注意的是forforeach的一點區別:在for循環中,可以對其數組進行修改;而foreach是隻讀的,不能修改。
另外,還有一些特殊的語句,比如:break;跳出循環,continue;結束本次循環,return;可以返回值,也可以結束程序的執行。Throw;拋出異常。
2、結構
結構式封裝了一些兒小型的相關變量組,這些變量的類型是可以不相同的。結構呢,是屬於值類型的。它不能夠被繼承,但是可以實現接口。結構的訪問修飾符只能是publicinternal這兩種,是不能用protected的。
結構是可以賦值爲null的,這與其它的值類型不太一樣,如果值類型想賦值爲null的話,則要加?號才行。
說道結構,就要說一說結構和類之間的區別了。在結構中,如果重載構造函數,系統默認的無參的構造函數也是存在的,而類中這個默認的構造函數是會被新的構造函數所代替的。還有,在結構中,一旦有構造函數,那麼,所有在結構中聲明的字段(除了常量和靜態的),都是需要在構造函數中賦值的(成員是不能自己給自己賦初值的,只能在構造函數中),而類中是根據需要來賦值。
最後就是結構中,如果實例化時,是可以不用new關鍵字的,如果用new關鍵字來調用的話,系統會默認的賦初值的,若不用,則必須先給其賦值,然後使用;而類中只能通過new來調用。
3、枚舉
枚舉是有一組稱爲枚舉數列表的命名常量組成,它是將某一系列的類型統一放到一起,這樣,我們使用起來就方便了。
特點:每種枚舉類型都有基礎類型,該類可以是除char以外的任何整型。枚舉元素的默認基礎類型爲int。默認情況下,第一個枚舉數的值爲0,後面每個枚舉數的值依次遞增1。還有,枚舉的每個元素都是一個常量。
屬性枚舉:(Flags)用於枚舉的或運算
4、值類型、引用類型
值類型,是放在線程堆棧中的,調用時傳遞的是值,這樣,不管新值是否發生變化,都對新值沒有影響。常見的值類型有三種:簡單類型、枚舉類型、結構類型;
引用類型,他存儲的是一個引用,在託管堆中存放,在調用時傳遞的是地址。因此,不管把引用類型的賦給誰,對他們的修改,實質上都是對同一個地址進行的操作,所以,其結果是會發生變化的。常見的引用類型有:類類型、接口類型、Unicode字符串、數組類型、委託類型。
5、裝箱、拆箱
裝箱:就是將值類型轉換爲引用類型的
拆箱:就是將引用類型還原爲值類型。
說明:在我們平時寫代碼的過程中,我們會經常地進行裝箱和拆箱的操作,這樣會大大降低程序的執行效率,所以,我們要儘量的避免裝箱和拆箱的操作。
6、String、StringBuilder
String是一個不可變的順序字符集,可以直接賦值來構造,不用new的。
String一旦定義,就不可變,如果發生變化的話,就會重新生成性的字符串,原來的就會變成了垃圾。如果字符串相同的話,可以共用一個字符串,這是傳說中的字符串留用。
StringBuilder也是用來存儲字符集的,但是它是可變的。
它是在System.Text這個命名空間中,每次分配char類型的數組的長度,只有調用ToString()這個方法後,纔會重新分配內存。
7、數組
Array是所有數組的父類,在這個類中,提供了創建、操作、搜索和排序數組的方法,用CreateInstance(Type, Int32)可以來實例一個數組。
數組共分爲以下幾種:
一維數組:如int [] arr=new int[2]{1,2};
二維數組:如int [,] arr=new int[2,2];
交錯數組:如int [][] arr=new int[][];
說明:交錯數組時元素爲數組的數組。交錯數組元素的維度和大小可以不同。
8、集合
集合時一組組合在一起的類似的類型化對象。內部是用數組來存儲信息的。
集合一般都是動態的,這樣我們就可以動態的添加元素。
比較常用的有ArraylistList
Arraylist,來自命名空間System.Collections;它通過Add()方法來添加數據,可以用名稱[0]來取;
如:Arraylist al=new Arraylist();
如果在這指定長度,則這個長度指的是容量,並不是集合裏面數據的長度(該長度一般用Count來取),它的默認長度是4,超過後就要翻倍:4,8,16。。。
泛型list的用法和Arraylist差不多,但是泛型用起來要比Arraylist要好用,推薦使用泛型。
9、類
類是一組具有相同數據結構和相同操作的對象的集合。類是對一系列具有相同性質的對象的抽象,是對對象共同特徵的描述。
類中的成員可以有字段、方法、屬性、索引器、事件、委託
說到類,就不得不說一說oop,面向對象的思想,說白了,就是我們在編程時,要用人類的思維去考慮問題,把相同的數據結構和操作抽象成類,然後對其進行操作。
面向對象有三大特點:繼承、封裝、多態。這三大技術都是通過類類實現的
10、方法參數(ref,out,params
Ref out的操作對象都是值類型的數據。它們可以將值類型的數據臨時的當引用類型的來用。
Ref是能進能出。什麼意思呢,也就是說,我們可以將已經賦了值的變量,通過加上關鍵字ref,將其整個變量的名稱和值一同帶進方法的內部進行操作,完了之後,還可以將這個變量的最終結果給帶出來。
out的能力就有點小了,out只能將這個變量的名稱帶進去,之後,在方法中要先對其賦值,然後進行相應的操作,最終將其結果帶出來。總結一下,就是out只能出。
Params是一個動態的參數。範圍(0n
也就是說,我們在定義方法的時候,並不知道要傳進去的參數的個數,這個時候,就可以通過定義Params這個動態的參數了。
11、分部方法,擴展方法,匿名方法
分部方法,通過partial關鍵字來實現。
一般是用於分部類中的,但是這兩個類的簽名必須是一樣的。這樣,我們就可以實現在一個類中只定義方法的簽名,供我們來使用,而在另一個類中,可以有別的人來實現它。
注意:1 分部類必須在同一個命名空間
2、分部方法不能有訪問修飾符的

 

擴展方法,就是針對一些系統類,我們需要來添加一些方法供我們使用,但是,由於是系統自定義的,我們肯定是看不到源代碼的,不能直接對其修改,這樣,擴展方法就出場了。
定義:擴展方法必須在靜態類中定義
而且,擴展的方法也必須是靜態的,方法中的參數用this關鍵字加上要擴展的類名 
匿名方法:通常用委託來定義。
12、構造函數
構造函數:分爲實例構造函數、私有構造函數和靜態構造函數。值得說明一點的是靜態構造函數,只要是聲明瞭一個類的對象,就會自動調用這個靜態構造函數,而且只在第一次聲明的時候調用。
說道構造函數,就不得不說一下析構函數,首先,析構函數是針對類的,在結構中式沒有析構函數的,再者就是,一個類中只能有一個析構函數,析構函數是不能繼承和重載的,而且析構函數是沒有修飾符和參數的,同時,析構函數是系統自動調用的,也就是說,我們是無法自己來調用析構函數的。
13、字段、屬性
字段是類或結構中的對象或值,雷和結構可以使用字段來封裝數據。一般字段的聲明都是private的,不建議使用public。還有就是,字段的初始化要在調用對象實例的構造函數之前。如果構造函數爲字段已經賦值了,那麼,我們再對字段賦值,都是無效的。
我們還可以將字段聲明爲readonly,這樣,這個字段就是隻讀的了。
屬性:是一種封裝字段的技術,這樣,我們就可以靈活的去控制這個字段的讀寫權限了。
屬性中有getset兩個訪問器。通過value關鍵字來對其賦值。
14、索引器
索引器:允許類或結構的實例就像數組一樣來訪問。索引器的定義類似於屬性,不同之處是索引器使用了this關鍵字來訪問。
索引器可以有多個形參,就像二維數組一樣。
一般的,使用索引器的話,都可以用泛型的技術來實現。
15、委託
委託:是一種承載方法的,這個方法可以有多個。方法有實例方法,靜態方法,回調方法(異步),我們可以把委託想象爲父類,而承載的方法是子類,也就是說,子類通過重載實現了父類的方法。這樣,我們就知道,方法不必與委託簽名完全匹配的。
委託是和類一個級別的,因此,委託可以定義到類的外面,亦可以在類的裏面。
使用委託的步驟:
1、  定義委託
2、  定義方法
3、  New委託,將方法賦給委託(在這裏,new有兩個功能,一個是分配內存空間,二是完成指針的功能。
委託的協變和逆變:它們的本質都是子類型賦給父類型。不同的是,協變的賦值對象是返回值,而逆變的賦值對象是參數
特別注意的是:給委託賦值時,方法名一定不能加括號(如果有括號,就成了調用了)。
16、事件
事件:可以理解爲類與類之間發出的通知,到收到通知後,進行相應的操作。
我們把發送事件的類稱爲:發行者
把接收或處理事件的類稱爲:訂戶
它們之間的關係是這樣的:一個事件可以有多個訂戶,一個訂戶可以處理來自多個發行者的多個事件。
事件是基於EventHandler委託和EventArgs基類的,爲啥這麼說呢,對拉,一般事件都要靠委託來實現的。
17、靜態類,密封類,抽象類
靜態類:聲明爲靜態類的話,這個項目中,只會有一份,沒有副本。靜態類中調用成員時都是 類名加成員
靜態類特點:
僅包含靜態成員;
不能被實例化;
是密封的;
不能包含實例構造函數。
密封類:用關鍵字sealed來定義類。
密封類不能用作基類,所以,他不能是抽象的。密封類主要用於防止派生。
抽象類:用abstract關鍵字
抽象類時不能實例化的,其成員是不能有抽象字段的,抽象的方法和字段都不能賦值。
抽象類是可以被繼承的,一旦定義了抽象的方法、屬性、索引器、事件,那麼子類要是想重新覆蓋,必須使用關鍵字override
實例化繼承的抽象類時,要將抽象類中所有的抽象成員實例化
注意:
1、  抽象類可以繼承和那個抽象類,但是可以不實例化其抽象成員。
2、  如果構造函數有參數的話,必須繼承
3、  抽象類也可以繼承實例化類
18、接口
接口是一種類似與抽象類的功能,用interface關鍵字來聲明。接口與抽象類不同的是:
1、  任何非抽象類型,如果繼承了該接口,那麼子類都必須實現接口的所有成員
2、  接口中的成員都只能聲明,不能夠實現的(抽象類中的抽象方法是可以實現的)
3、  接口中的成員一共有四種:方法、屬性、事件、索引器。
4、  接口中成員的訪問修飾符只能是public,而且,在聲明的時候,是不允許寫出public的,系統會默認的添加
接口是支持多重繼承的,也就是說,類和接口可以從多個接口繼承,同時,接口自身也可以從多個接口繼承。
19、虛方法、重載方法
虛方法:用virtual關鍵字來聲明
一般用於繼承,如果要覆蓋虛方法,那麼必須用override關鍵字。
重載方法:
有時候,我們在定義方法的時候,對於同一個方法,我們可能會有不同的需求,這就用到了重載方法了。
每個類型成員都有一個唯一的簽名。方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。只要簽名不同,就可以在一種類型內定義具有相同名稱的多種方法。
20、繼承
繼承:類可以從其他類中繼承,這樣,子類就擁有了父類的一些方法和屬性等;
如果子類想覆蓋父類的方法,則必須在父類的方法中用virtual關鍵字聲明,然後在子類中用override關鍵字來覆蓋;
如果子類要定義一個與父類具有相同的方法簽名的方法,那麼,可以使用new關鍵字顯式的隱藏父類的方法(如果沒有new的話,會隱式的隱藏)
21、訪問修飾符
訪問修飾符很多,在這裏,我們只介紹一些常用的:
Private   私有的,一般只能在類的內部使用,它的作用增加了成員的安全性
Public  公有的,也是我們最常用到的,它可以在整個項目中都可以訪問到
Protected 受保護的,一般用於繼承,只能是其派生類可以訪問
Internal  內部的   ,它的作用範圍是整個程序集
protected internal   在同一個程序集中能夠訪問到,出了這個程序集後,只能在子類中才能訪問到
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章