C#筆記

原義字符串以 @ 開頭並且也用雙引號引起來。 
原義字符串的優勢在於 不 處理轉義序列,因此很容易寫入,例如完全限定的文件名就是原義字符串: 
@"c:/Docs/Source/a.txt"  // rather than "c://Docs//Source//a.txt"

若要在一個用 @ 引起來的字符串中包括一個雙引號,請使用兩對雙引號: 
@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

1. using關鍵字, using namespace  , using system  ; 
   using myalias = mynamespace ;  定義別名 
2.console.readline(),用於使程序在執行完上面的代碼後不立即退出,在用戶按回車鍵之後才退出程序 
3.C# 支持採用中文作爲標識符 
4.使用關鍵字作爲標識符時,在關鍵字前加“@” 
5.數據類型之間的轉換: 強制類型裝換 ; ToString  ; Convert類  ; 
6.C#中不存在全局變量 。但是可以用另外一種技術實現類似於全局變量的方法,即靜態類和靜態變量。static  。
7.如果希望程序不進行溢出檢測,則可以使用關鍵字 unchecked ; 
8.C#中可以使用 is 關鍵字進行類型檢測。 
9.命令窗口調試:視圖 --其他窗口--命令窗口 。輸入 immed ,進入臨時窗口。 
10. C#中有一個關鍵字sizeof ,用於檢測關鍵字的容量大小。 
11.Console.WriteLine("{0}{1}{2}{3}...") ,分別代表第一個,第二個 。。。變量。 
12.隱型局部變量 。“var”關鍵字,允許開發者建立一個變量,但不必明確變量的類型,編譯器會實現自動類型轉換。 
13. | 邏輯或運算  ,|| 條件邏輯或運算 。 
14.goto語句 ; goto是C#中的一個關鍵字,goto語句的功能將程序控制權直接傳遞給標記語句。語句標記爲  : 
14. 方法的註釋,///開始 ,可以形成產品文檔 。 
15.ref 關鍵字使參數按引用傳遞。若要使用ref參數,則定義方法和調用方法都必須顯式的使用ref關鍵字。在調用時,傳遞到ref參數的參數必須最先初始化。 
16.out關鍵字會導致參數通過引用來傳遞,這與ref關鍵字類似,不同的是ref關鍵字要求變量在傳遞之前進行初始化。若要使用out參數,定義方法和調用方法也都必須顯式的使用out關鍵字。  (ref修飾的參數作爲輸入參數,out修飾的參數作爲輸出參數)。 
17.在變量作用域的問題上for循環與一個方法相當。 
  for循環中定義的變量在for循環外是非法的。 
  在for循環外定義的變量,必須先進行初始化,然後纔可以在for循環內使用。 
在C#中,只有在聲明變量並且對其進行初始化時纔會爲其進行分配內存。當在for循環內部進行初始化時,變量的作用域在for循環的內部。當在外部初始化改變量時,保證變量的範圍在main方法內,因此可以保證for循環正確使用。 
18.方法的重載:1)參數類型重載的方法 2)參數引用重載的方法。(以參數帶ref和不帶ref來調用不同的方法) 3)參數個數重載。根據參數個數的不同調用不同的方法。 
19.當Main方法定義在兩個類中的時候,可以通過在vs中設置程序入口點,解決Main方法衝突問題。項目--屬性 ,應用程序 - 啓動對象 。 
20.Main方法的參數,可在項目--屬性 ,調試 里加入 啓動參數  。 
21.Main方法的注意事項:必須爲靜態,而不應爲公共的,而且可以具有void 或int返回類型。聲明main方法時,即可以使用參數,也可以不使用參數。 
22.擴展方法: 
public static string toStr1(this int x) 

    return x.ToString(); 

類必須使用靜態類 ;擴展方法必須使用static關鍵字定義;擴展方法的第一個參數前,必須有this關鍵字。 
靜態方法在調用時,必須指明方法所在的類,而擴展方法調用時,直接使用變量的toStr1方法即可。擴展方法已經綁定到參數指定的類型上面。 
23.“Lambda 表達式”是一個匿名函數,它可以包含表達式和語句,並且可用於創建委託或表達式樹類型。

所有 Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀爲“goes to”。 該 Lambda 運算符的左邊是輸入參數(如果有),右邊包含表達式或語句塊。Lambda 表達式 x => x * x 讀作“x goes to x times x”。可以將此表達式分配給委託類型,如下所示:

delegate int del(int i); 
static void Main(string[] args) 

    del myDelegate = x => x * x; 
    int j = myDelegate(5); //j = 25 

/////////////////////////////////////////////// 
(input parameters) => expression 
只有在 Lambda 有一個輸入參數時,括號纔是可選的;否則括號是必需的。兩個或更多輸入參數由括在括號中的逗號分隔:(x, y) => x == y

有時,編譯器難於或無法推斷輸入類型。如果出現這種情況,您可以按以下示例中所示方式顯式指定類型:(int x, string s) => s.Length > x

使用空括號指定零個輸入參數:() => SomeMethod()

24.異常類try ... catch 語句 。 
    還可以在代碼中編寫拋出異常的語句,方法是使用throw關鍵字。 
   finally 代碼塊用於清除try代碼塊中分配的任何資源,以及運行任何代碼(即使發生異常時也必須執行代碼)。finally代碼塊總是會被執行。

25.類 :定義屬性。通過屬性可以方便的訪問和修改字段的值,通常屬性包括get代碼塊和set代碼塊。get塊用於訪問字段值,set塊用於設置字段值。同時,屬性也可以不對字段進行任何操作。set代碼塊中的value表示調用屬性的代碼中屬性被賦的值。

26.如果不書寫任何訪問修飾符時,默認 採用private進行修飾。 
  protected關鍵字是一個受保護成員訪問修飾符。受保護成員在他的類中可訪問並且可由派生類訪問,這是一個介於public和private之間的修飾符。 
  internal 關鍵字是類型和類型成員的訪問修飾符。只有在同一個程序集的文件中,內部類型或成員纔是可訪問的。 
27.繼承關係使用在類名後面依次加冒號、基類名的方法表示。 
28.this關鍵字用於訪問當前類中的各個元素。 
29.在現有項目中添加新類的方法 : 
  1)解決方案管理器 --添加--類 。 
  2)解決方案管理器 --添加--新建項 ,類圖 。將自動打開類設計器,在工具箱中也出現類設計器,將工具箱中的內容拖到設計圖上可以添加相應的內容,在類結構圖上右擊,可添加其他屬性,方法,構造函數,析構函數等。 
30.枚舉是一個指定的常數,其基礎類型可以是除char以外的任何整形。如果沒有顯式聲明基礎類型,則使用int32 。枚舉類型有名稱,基礎類型和一組字段。基礎類型必須是一個內置的整形,字段是靜態文本字段,其中的每一個字段都表示常數。同一個值可以分配給多個字段,當出現這種情況時,必須將其中某個值標記爲主要枚舉值,以便進行反射和字符串轉換。默認情況下,枚舉中定義的值是根據定義的順序從0開始順序遞增的。 
31.結構可以包含構造函數,常量,字段,方法,屬性,索引器,運算符,事件和嵌套類型。 
32.結構的初始化:1)單個成員初始化 
              2)使用構造函數。和類的構造函數基本相同。 
public Student(int m_id , string m_name , string m_school) 

    id = m_id ; 
    name = m_name ; 
    school = m_school ; 
}

Student mystudent1 = new Student(1,“li”,“hnu”);

33.結構的方法:同類基本相同。當用new關鍵字創建變量時,調用構造函數,不使用new時,不用構造函數。

34.結構和類的區別: 
    1)結構是值類型,在堆棧上分配地址,所有的基本類型都是結構類型。 
       類是引用類型,在堆上分配地址。 
    結構是值類型,所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是複製引用。    
儘管結構的初始化也使用了new關鍵字,但是結構對象依然分配在堆棧上,如果不使用new,那麼在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用。    
    2)結構,不可繼承。 
       類:可以繼承。

    3)內部結構。 
    結構:沒有 默認構造函數,沒有析構函數。沒有abstract和sealed(因爲不能    繼承),不能有protected修飾符,可以不使用new初始化。在結構中初始化實例    字段是錯誤的。 
35.數組定義: int[] array = {1,2,3} ;int[] array = new int[3] ; 
        int[,] array = new int[2,2] ; 
36.交錯數組: 這種數組的元素是數組。交錯數組元素的維數和緯度大小可以不同。 
        int[][] array = new int[3][] ;此數組由三個元素組成,每個元素都是一個數組。同樣,訪問交錯數組中的元素必須對其進行初始化: 
            array[0] = new int[2] ; 
            array[1] = new int[2] ; 
            array[2] = new int[2] ; 
37.數組的遍歷 :foreach語句。foreach(int number in array) ; 數組 
                foreach(int[] number in array) ;二維 
                number是自定義的,代表arrary中的元素。

38.數組清空:arrary.Clear() ; 
        public static void Clear(Arrary arrary ,int index ,int length) ;  起始索引,長度 。

39.數組的查找 : Arrary.IndexOf 和Arrary.LastIndexOf ;數組排序:Arrary.Sort 
        Arrary.Reverse ; 
40.ArraryList 動態數組 。 
41.Hashtable 是以一種鍵值對形式存在的,因此要通過鍵來訪問Hashtable中的值,即Hashtable[key] . 
42.Queue :先進先出 
43.Stack :先進後出 
44.SortedList:提供了類似於ArraryList 和Hashtable的特性,可以將其理解爲一種結合體。SortedList表示鍵值對的集合,這些鍵值對按鍵排序並可按照鍵和索引訪問。 
45.Dictionary :字典類,提供了從一組鍵到一組鍵的映射。 
    遍歷Dictionary通常採用foreach語句,此時需要認識另外一個類KeyValuePair    ,該類用來表示Dictionary中的條目。 
46.接口不負責功能的實現,只負責功能的定義,而類負責功能的具體實現。 
Interface IMyInterface     {     } 
    通常使用I加英文單詞的方式定義接口的名稱。 
    接口和類的區別: 
    1)接口可以用任何可訪問性來聲明,但接口成員必須全都具有公共可訪問性。也就是說定義接口的成員時不能使用訪問修飾符。 
    2)不能向成員接口自身附加安全性權限。不能使用static,virtual,abstract和sealed來定義。 
    3)接口不能定義構造函數。    
    4)接口中不允許定義字段。 
47.接口同類一樣,接口之間允許繼承。顯然,類也可以從接口繼承。 
48.類可以繼承於一個類,C#不允許類之間的多重繼承。類可以繼承多個接口,類還可同時繼承類和接口。 
49.在實際應用中,可以將類作爲參數傳遞到方法中,接口同樣可以作爲參數應用。 
50.接口同樣可也作爲返回值。如果在多重繼承中出現名稱衝突問題。可以採用顯式的方法解決名稱衝突的問題。
51.抽象類的用途是提供多個派生類可共享的基類的公共定義,並使用abstract關鍵字定義。使用abstract關鍵字不僅可以創建僅用於繼承用途的類,也可以定義類成員,即定義派生的非抽象類的功能。 
abstract class Class1    {    } 
抽象類的用途與接口很相似,抽象類也不能實例化,這點和接口相同,但抽象類中可以定義方法的實現。可以把抽象類看做接口和普通類的結合。 
52.抽象類中可以定義抽象方法,其定義方法爲在所定義的方法前加abstract關鍵字。但是抽象成員不能是私有的。必須加public 
              abstract public  void SayHello() ; 
抽象成員沒有實現,否則,編譯器報錯。但抽象類的派生類必須實現所有抽象方法。要實現抽象成員,必須使用override關鍵字,並且該成員不能爲私有的。 
53.密封類可以用來限制擴展性。當在程序中密封了某個類時,其他類不能從該密封類繼承。使用密封類可以防止對類進行自定義,這種特性在某些情況下與面向對象編程技術的靈活性和可擴展性是相牴觸的。通常不建議使用密封類。 
密封類的定義是通過sealed關鍵字實現的。 
        sealed class MySealedClass    {    } 
密封類不能作爲基類。 
由於密封類的不可繼承性,因此,他也不能是抽象類。密封類的主要作用是用於防止派生。密封類的這種特性使其從不作爲基類,因此對密封類成員的調用速度略快。 
    還可以在重寫基類中的虛方法或虛屬性的方法或屬性上使用 sealed 修飾符。 這將使您能夠允許類從您的類繼承,並防止它們重寫特定的虛方法或虛屬性。 
    當在類中定義新的方法或屬性時,通過不將這些方法或屬性聲明爲 virtual,可防止派生類重寫這些方法或屬性。 
    將 abstract 修飾符用於密封類是錯誤的做法,因爲抽象類必須由提供抽象方法或屬性的實現的類繼承。 
    當應用於方法或屬性時, sealed 修飾符必須始終與 override 一起使用。 
由於結構是隱式密封的,因此它們不能被繼承。

54.is運算符用於檢測對象是否與給定類型兼容。 
   as運算符用於在兼容的引用類型之間執行轉換。與強制轉換不同,as運算符不會引發錯誤。當轉換失敗時,運算符將產生空值,而不是引起異常。 
55.virtual關鍵字用於修飾方法,屬性,索引器或事件聲明,並且允許在 派生類中重寫這些對象。被 virtual修飾的方法(虛方法)可以被任何繼承他的類重寫。要擴展或修改繼承的方法、屬性、索引器、事件的抽象實現或虛實現,必須使用override關鍵字。 
C#允許派生類包含與基類方法名稱相同的方法,但必須: 
    1)基類方法必須定義爲virtual 
    2)如果派生類的方法前沒有new 或override關鍵字,則編譯器將發出緊告,該方法將和存在new關鍵字一樣執行操作。 
    3)如果派生類中的方法前面帶有new關鍵字,則該方法被定義爲獨立於基類的方法。 
    4)如果派生類中的方法前面帶有override關鍵字,則派生類的對象將調用該方法,而不調用基類方法。 
    5)可以從派生類中用base關鍵字調用基類方法。 
    6)override,virtual和new關鍵字還可以用於屬性,索引器和事件中。

56.使用 static 修飾符聲明屬於類型本身而不是屬於特定對象的靜態成員。 
static 修飾符可用於類、字段、方法、屬性、運算符、事件和構造函數,但不能用於索引器、析構函數或類以外的類型。 
常數或者類型聲明隱式地是靜態成員。 
不能通過實例引用靜態成員。然而,可以通過類型名稱引用它

儘管類的實例包含該類所有實例字段的單獨副本,但每個靜態字段只有一個副本。 
不可以使用 this 來引用靜態方法或屬性訪問器。 
如果對類應用 static 關鍵字,則該類的所有成員都必須是靜態的。 
類和靜態類可以有靜態構造函數。靜態構造函數在程序開始和類實例化之間的某個時刻調用。

靜態類與非靜態類基本相同,但存在一個區別:靜態類不能實例化。 也就是說,不能使用 new 關鍵字創建靜態類類型的變量。 因爲沒有實例變量,所以要使用類名本身訪問靜態類的成員。例如,如果名爲 UtilityClass 的靜態類有一個名爲 MethodA 的公共方法,則按下面的示例所示調用該方法:UtilityClass.MethodA();

下表介紹靜態類的主要特性:

僅包含靜態成員。

無法實例化。

是密封的。

不能包含 實例構造函數。

因此,創建靜態類與創建僅包含靜態成員和私有構造函數的類基本相同。私有構造函數阻止類被實例化。使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加實例成員。編譯器將保證不會創建此類的實利。

靜態類是密封的,因此不可被繼承。它們不能從除 Object 外的任何類中繼承。 靜態類不能包含實例構造函數,但可以包含靜態構造函數。如果非靜態類包含需要進行重要的初始化的靜態成員,也應定義靜態構造函數。

非靜態類可以包含靜態的方法、字段、屬性或事件。即使沒有創建類的實例,也可以調用該類中的靜態成員。始終通過類名而不是實例名稱訪問靜態成員。無論對一個類創建多少個實例,它的靜態成員都只有一個副本。靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,並且不能訪問任何對象的實例變量(除非在方法參數中顯式傳遞)。

更常見的做法是聲明具有一些靜態成員的非靜態類,而不是將整個類聲明爲靜態類。靜態字段有兩個常見的用法:一是記錄已實例化對象的個數,二是存儲必須在所有實例之間共享的值。

靜態方法可以被重載但不能被重寫,因爲它們屬於類,不屬於類的任何實例。

雖然字段不能聲明爲 static const,但 const 字段的行爲在本質上是靜態的。 這樣的字段屬於類型,不屬於類型的實例。因此,可以同對待靜態字段一樣使用 ClassName.MemberName 表示法來訪問 const 字段。 不需要對象實例。

C# 不支持靜態局部變量(在方法範圍內聲明的變量)。

通過在成員的返回類型之前使用 static 關鍵字可以聲明靜態類成員

靜態成員在第一次被訪問之前並且在調用靜態構造函數(如有存在)之前進行初始化。若要訪問靜態類成員,應使用類名而不是變量名來指定該成員的位置

57.屬性:屬性是類中除方法之外另一種可以對字段進行操作的“方法”。儘管技術上屬性和方法非常類似,但使用上卻有很大的差別。 
只讀屬性:只提供get訪問器,而不編寫set部分。 
屬性中可以包含代碼。屬性中的代碼可以進行對屬性的賦值和讀取進行控制,檢測等很多工作。 
58.迭代器:迭代器似的開發人員能夠實現在類或結構中支持foreach迭代,而不必實現整個IEnumberable接口。 
迭代器概述: 
迭代器是可以返回相同類型的值的有序序列的一段代碼。

迭代器可用作方法、運算符或 get 訪問器的代碼體。

迭代器代碼使用 yield return 語句依次返回每個元素。 yield break 將終止迭代。

可以在類中實現多個迭代器。每個迭代器都必須像任何類成員一樣有唯一的名稱,並且可以在 foreach 語句中被客戶端代碼調用,如下所示: foreach(int x in SampleClass.Iterator2){}。

迭代器的返回類型必須爲 IEnumerable、 IEnumerator、 IEnumerable <(Of <(T >)>) 或 IEnumerator <(Of <(T >)>)。

迭代器是 LINQ 查詢中延遲執行行爲的基礎。

yield 關鍵字用於指定返回的一個或多個值。 到達 yield return 語句時,會保存當前位置。 下次調用迭代器時將從此位置重新開始執行。

迭代器對集合類特別有用,它提供一種簡單的方法來迭代複雜的數據結構(如二進制樹)。

    創建迭代器最常用的方法是對 IEnumerable 接口實現 GetEnumerator 方法。

public System.Collections.IEnumerator GetEnumerator() 

    for (int i = 0; i < 10; i++) 
    { 
        yield return i; 
    } 

GetEnumerator 方法的存在使得類型成爲可枚舉的類型,並允許使用 foreach 語句。

foreach語句用於訪問數組或對象集合中的每個元素,同樣也可以用於實現了迭代器的類,但不應用於更改集合內容,以避免產生不可預知的錯誤。 
可以在同一個迭代器中使用多個 yield 語句。

59.分部類:將類、結構或接口的定義拆分到兩個或多個源文件中,每個源文件包含類定義的一部分,編譯應用程序時,visual studio 2010 會把所有部分組合起來,這樣的類被稱爲分部類。分部類用partial關鍵字定義。 
    代碼中在類前加partial 說明該類是一個分部類,雖然沒有該分部類的其他部分,但C#任然將其作爲分部類處理。但是應該避免這種做法,這樣顯然會增加.NET Framework的負擔,因爲.NET Framework將會搜索其他部分。

    各個部分必須具有相同的可訪問性,如public ,private 等。

    分部類的兩部分都必須用partial限定。 
    在類的兩個部分分別使其繼承不同的類和接口,運行時,.NET Framework能夠將其很好的結合。 
    partial關鍵字的位置必須位於緊接class ,interface 以及struct的位置。

60.索引器允許類或結構的實例就像數組一樣進行索引。索引器類似於 屬性,不同之處在於它們的訪問器採用參數。 
索引器概述使用索引器可以用類似於數組的方式爲對象建立索引。

get 訪問器返回值。 set 訪問器分配值。

this 關鍵字用於定義索引器。

value 關鍵字用於定義由 set 索引器分配的值。

索引器不必根據整數值進行索引,由您決定如何定義特定的查找機制。

索引器可被重載。

索引器可以有多個形參,例如當訪問二維數組時。

要聲明類或結構上的索引器,請使用 this 關鍵字,如下例所示:

public int this[int index]    // Indexer declaration 

    // get and set accessors 

索引器的定義採用訪問限定符後跟返回值類型、this關鍵字、索引參數的形式。其中,索引參數要包含在索引操作符[]中。

61.泛型: 
泛型概述使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。

泛型最常見的用途是創建集合類。

.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。 應儘可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList。

您可以創建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委託。

可以對泛型類進行約束以訪問特定數據類型的方法。

關於泛型數據類型中使用的類型的信息可在運行時通過使用反射獲取。

在定義泛型類時,可以對客戶端代碼能夠在實例化類時用於類型參數的類型種類施加限制。如果客戶端代碼嘗試使用某個約束所不允許的類型來實例化類,則會產生編譯時錯誤。這些限制稱爲約束。約束是使用 where 上下文關鍵字指定的。

62.委託是一種定義方法簽名的類型,可以與具有兼容簽名的任何方法關聯。 您可以通過委託調用方法。委託用於將方法作爲參數傳遞給其他方法。事件處理程序就是通過委託調用的方法。您可以創建一個自定義方法,當發生特定事件時某個類(例如 Windows 控件)就可以調用您的方法。下面的示例演示了一個委託聲明: 
        public delegate int PerformCalculation(int x, int y);

與委託的簽名(由返回類型和參數組成)匹配的任何可訪問類或結構中的任何方法都可以分配給該委託。方法可以是靜態方法,也可以是實例方法。這樣就可以通過編程方式來更改方法調用,還可以向現有類中插入新代碼。只要知道委託的簽名,就可以分配您自己的方法。 
在方法重載的上下文中,方法的簽名不包括返回值。但在委託的上下文中,簽名的確包括返回值。換句話說,方法和委託必須具有相同的返回值。

將方法作爲參數進行引用的能力使委託成爲定義回調方法的理想選擇。例如,可以向排序算法傳遞對比較兩個對象的方法的引用。分離比較代碼使得可以採用更通用的方式編寫算法。

委託概述委託具有以下特點:

委託類似於 C++ 函數指針,但它們是類型安全的。

委託允許將方法作爲參數進行傳遞。

委託可用於定義回調方法。

委託可以鏈接在一起;例如,可以對一個事件調用多個方法。

方法不必與委託簽名完全匹配。

63.委託是一種安全地封裝方法的類型,它與 C 和 C++ 中的函數指針類似。 與 C 中的函數指針不同,委託是面向對象的、類型安全的和保險的。委託的類型由委託的名稱定義。下面的示例聲明瞭一個名爲 Del 的委託,該委託可以封裝一個採用 字符串作爲參數並返回 void 的方法。 
public delegate void Del(string message);

構造委託對象時,通常提供委託將包裝的方法的名稱或使用 匿名方法。 實例化委託後,委託將把對它進行的方法調用傳遞給方法。調用方傳遞給委託的參數被傳遞給方法,來自方法的返回值(如果有)由委託返回給調用方。這被稱爲調用委託。可以將一個實例化的委託視爲被包裝的方法本身來調用該委託。例如: 
// Create a method for a delegate. 
public static void DelegateMethod(string message) 

    System.Console.WriteLine(message); 
}

// Instantiate the delegate. 
Del handler = DelegateMethod;

// Call the delegate. 
handler("Hello World");

委託類型派生自 .NET Framework 中的 Delegate 類。 委託類型是 密封的,不能從 Delegate 中派生委託類型,也不可能從中派生自定義類。 由於實例化委託是一個對象,所以可以將其作爲參數進行傳遞,也可以將其賦值給屬性。這樣,方法便可以將一個委託作爲參數來接受,並且以後可以調用該委託。這稱爲異步回調,是在較長的進程完成後用來通知調用方的常用方法。以這種方式使用委託時,使用委託的代碼無需瞭解有關所用方法的實現方面的任何信息。此功能類似於接口所提供的封裝。有關更多信息,請參見 何時使用委託而不使用接口。

回調的另一個常見用法是定義自定義的比較方法並將該委託傳遞給排序方法。它允許調用方的代碼成爲排序算法的一部分。下面的示例方法使用 Del 類型作爲參數: 
public void MethodWithCallback(int param1, int param2, Del callback) 

    callback("The number is: " + (param1 + param2).ToString()); 
}

然後可以將上面創建的委託傳遞給該方法: 
MethodWithCallback(1, 2, handler);

在控制檯中將收到下面的輸出:

The number is: 3

在將委託用作抽象概念時, MethodWithCallback 不需要直接調用控制檯 -- 設計它時無需考慮控制檯。 MethodWithCallback 的作用只是準備字符串並將該字符串傳遞給其他方法。 此功能特別強大,因爲委託的方法可以使用任意數量的參數。

將委託構造爲包裝實例方法時,該委託將同時引用實例和方法。除了它所包裝的方法外,委託不瞭解實例類型,所以只要任意類型的對象中具有與委託簽名相匹配的方法,委託就可以引用該對象。將委託構造爲包裝靜態方法時,它只引用方法。考慮下列聲明: 
public class MethodClass 

    public void Method1(string message) { } 
    public void Method2(string message) { } 

加上前面顯示的靜態 DelegateMethod,現在我們有三個方法可由 Del 實例進行包裝。

調用委託時,它可以調用多個方法。這稱爲多路廣播。若要向委託的方法列表(調用列表)中添加額外的方法,只需使用加法運算符或加法賦值運算符(“+”或“+=”)添加兩個委託。例如:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod;

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3;

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod;

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3;

此時, allMethodsDelegate 在其調用列表中包含三個方法 -- Method1、 Method2 和 DelegateMethod。 原來的三個委託 d1、 d2 和 d3 保持不變。 調用 allMethodsDelegate 時,將按順序調用所有這三個方法。 如果委託使用引用參數,則引用將依次傳遞給三個方法中的每個方法,由一個方法引起的更改對下一個方法是可見的。如果任一方法引發了異常,而在該方法內未捕獲該異常,則該異常將傳遞給委託的調用方,並且不再對調用列表中後面的方法進行調用。如果委託具有返回值和/或輸出參數,它將返回最後調用的方法的返回值和參數。若要從調用列表中移除方法,請使用減法運算符或減法賦值運算符(“-”或“-=”)。例如:

//remove Method1 
allMethodsDelegate -= d1;

// copy AllMethodsDelegate while removing d2 
Del oneMethodDelegate = allMethodsDelegate - d2;

由於委託類型派生自 System.Delegate,所以可在委託上調用該類定義的方法和屬性。 例如,爲了找出委託的調用列表中的方法數,您可以編寫下面的代碼:

int invocationCount = d1.GetInvocationList().GetLength(0);

在調用列表中具有多個方法的委託派生自 MulticastDelegate,這是 System.Delegate 的子類。 由於兩個類都支持 GetInvocationList,所以上面的代碼在兩種情況下都適用。

多路廣播委託廣泛用於事件處理中。事件源對象向已註冊接收該事件的接收方對象發送事件通知。爲了爲事件註冊,接收方創建了旨在處理事件的方法,然後爲該方法創建委託並將該委託傳遞給事件源。事件發生時,源將調用委託。然後,委託調用接收方的事件處理方法並傳送事件數據。給定事件的委託類型由事件源定義。有關更多信息,請參見 事件(C# 編程指南)。

在編譯時,對分配了兩種不同類型的委託進行比較將產生編譯錯誤。如果委託實例靜態地屬於類型 System.Delegate,則允許進行比較,但在運行時將返回 false。 例如: 
delegate void Delegate1(); 
delegate void Delegate2();

static void method(Delegate1 d, Delegate2 e, System.Delegate f) 

    // Compile-time error. 
    //Console.WriteLine(d == e);

    // OK at compile-time. False if the run-time type of f 
    // is not the same as that of d. 
    System.Console.WriteLine(d == f); 
}

64.事件(Event):類或對象可以通過事件向其他類或對象通知發生的相關事情。 發送(或引發)事件的類稱爲“發行者”,接收(或處理)事件的類稱爲“訂戶”。

在典型的 C# Windows 窗體或 Web 應用程序中,可訂閱由控件(如按鈕和列表框)引發的事件。可使用 Visual C# 集成開發環境 (IDE) 來瀏覽控件發佈的事件,選擇要處理的事件。IDE 會自動添加空事件處理程序方法和訂閱事件的代碼。

事件概述事件具有以下特點:

發行者確定何時引發事件,訂戶確定執行何種操作來響應該事件。

一個事件可以有多個訂戶。一個訂戶可處理來自多個發行者的多個事件。

沒有訂戶的事件永遠也不會引發。

事件通常用於通知用戶操作,例如,圖形用戶界面中的按鈕單擊或菜單選擇操作。

如果一個事件有多個訂戶,當引發該事件時,會同步調用多個事件處理程序。要異步調用事件,請參見 使用異步方式調用同步方法。

可以利用事件同步線程。

在 .NET Framework 類庫中,事件是基於 EventHandler 委託和 EventArgs 基類的。

65.button  的 Anchor 屬性:用於設置某個控件如何綁定到容器的邊緣,以及當容器的大小發生改變時,該控件如何響應。 
Cursor屬性:用於設置鼠標經過該控件時所顯示的樣式。 
Dock屬性可以使控件停靠在容器的邊框上。 
Image屬性:爲按鈕添加圖片 。

66.文本框TextBox的 
    CauseValidation:用於驗證文本框內容的合法性 
    CharacterCasing:用於指示所輸入文本的大小寫格式。 
    MaxLength:文本框所輸入字符的長度 
    MultiLine:是否接受多行 
    PasswordChar:常用語密碼輸入欄

67.單選框控件RadioButton:在一個容器(如Panel,GroupBox或窗體)內繪製單選按鈕即可將他們分組。直接添加到一個窗體中的所有單選按鈕將形成一個組。如要添加不同的組,必須將他們放到面板或分組框中。 
    Checked屬性表示是否選中。 
    Apperance屬性顯示不同的風格。 
    常用的事件:Click和CheckChanged兩種。 
68.複選框控件CheckBox;三種狀態:checked ,unchecked ,indeterminate。 
    CheckBox::Checked 屬性:獲取或設置一個值,該值指示 CheckBox 是否處於選中狀態。如果 CheckBox 處於選定狀態,則爲 true;否則爲 false。 默認值爲 false。 
    CheckBox::CheckState 屬性:如果 ThreeState 屬性設置爲 false,則 CheckState 屬性值只可以在代碼中設置爲 CheckState.Indeterminate,而不能通過用戶交互來設置。 
    CheckBox::ThreeState 屬性 :獲取或設置一個值,該值指示此 CheckBox 是否允許三種複選狀態而不是兩種。如果 CheckBox 可以顯示三種複選狀態,則爲 true;否則爲 false。 默認值爲 false。

69.分組框控件GroupBox:用於爲其他控件提供可識別的分組。通常可以用GroupBox控件爲RadioButton控件和CheckBox控件提供分組,這樣就可以在一個窗體中有幾個獨立的分組。

70.面板控件Panel:panel控件是另一種類型的控件,用於爲其他控件提供可識別的分組。通常,使用面板按功能細分窗體。panel控件類似於groupbox,但只有panel可以有滾動條,只有groupbox可顯示標題。

71.鏈接標籤控件LinkLabel。 
72.列表框控件ListBox 。 
73.可選列表框控件CheckedListBox:  CheckedItems ,Items[i] 
74.組合框控件Combobox    : selectedItem 
75.微調按鈕控件NumericUpDown

76.創建自定義控件:windows窗體控件庫 -拖入控件,編寫代碼,編譯。 
    在工具箱--常規,右擊-選擇項 ,瀏覽 ,找到編譯成功的.dll庫文件。

77.主菜單MenuStrip ,&F ,快捷鍵。右擊新創建的菜單,可以添加其他內容,如分隔符,圖像等。 
78.工具欄ToolStrip ; 
79.上下文菜單ContextMenuStrip。又叫彈出菜單或右鍵菜單,都是指在右擊相應的控件時彈出的菜單。 添加ContextMenuStrip1後,設置form1的ContextMenu屬性爲ContextMenuStrip1,運行程序即可。 
80.狀態欄StatusStrip:再添加StatusLabel ,text屬性顯示狀態信息。 
81.windows窗體應用程序分爲三類:基於對話框的應用程序,單一文檔界面(SDI)應用程序和多文檔界面(MDI)應用程序。 
82.RichTextBox是一種複雜的文本框,該控件用於顯示,輸入和操作帶有格式的文本。除具有textbox控件的所有功能外,還可以顯示字體,顏色和鏈接,從文件加載文本和嵌入圖像,撤銷和重複編輯操作,以及查找指定的字符。             

83.多窗口設計:新建項目,將form1 的IsMdiContainer 屬性設置爲True 。添加新項,windows窗體 form2, 
         form2 frm = new form2() ; 
         //使新建的form2窗體的父窗口爲當前窗體 
         frm.MdiParent = this ; 
         frm.show() ;

84.使用對話框:從屬性上看,對話框是FormBorderStyle屬性爲FixedDialog的窗體。

85.   打開文件對話框OpenFileDialog 
    openFileDialog1.ShowDialog(); 
    openFileDialog1.Title = "  " ; 
    openFileDialog1.InitialDirectory = @"E:/" ;

    openfiledialog 的返回值是dialogresult枚舉中的一個,爲dialogresult.ok或dialogresult.cancle。 
    openfiledialog.multiselect = false ; //是否允許多選 
    if(openfiledialog.showdialog()==dialogresult.ok) 
    { 
    form2 frm = new form2(); 
    StreamReader sr = new StreamReader(openfiledialog.openfile()); 
    frm.RichTextBoxText = sr.ReadToEnd() ; 
    frm.show() ; 
    }

86. 保存文件對話框SaveFileDialog : 
    Stream stream = saveFileDialog、openfile(); 
    streamWriter sw = new streamWriter(stream); 
    frmEdit frm = (frmEdit)this. ; 
    sw.write(frm.richtextboxtext) ;

87.字體設置對話框FontDialog:

88.窗體和對話框通常有兩種狀態,分別爲模式的和無模式的。模式的窗體或對話框必須關閉或隱藏,然後用戶才能繼續使用應用程序的其餘部分。如果使用ShowDialog方法顯示一個窗體,則爲模式的;用show方法時,爲無模式的對話框。

在窗體2中,formborderstyle改爲fixedDialog , 將controlBox 爲false 。 
按鈕 dialogresult 屬性可設置爲ok ,cancle 。

89.GDI+是.NET中圖形編程的高級內容。主要用於在窗體上繪製各種圖形圖像,可以用於繪製各種數據圖形,進行數學仿真等。 
Graphics類封裝一個GDI+繪圖圖面。Graphics對象表示GDI+繪圖表面(似畫布),用於創建圖形圖像的對象。繪圖時,需要先創建Graphics對象,然後纔可以使用GDI+繪製線條和形狀,呈現文本或顯示與操作圖像。 
    繪製圖形包括以下兩個步驟: 
    1)創建Graphics對象。 
    2)使用Graphics對象繪製線條和形狀,呈現文本或顯示與操作圖像。

    創建Graphics對象有三種方法: 
    1)在窗體或控件的Paint事件中進行對圖形對象的引用,作爲PaintEventArgs的一部分。 
private void Form1_Paint(object sender, PaintEventArgs e) 
        { 
            Graphics g = e.Graphics; 
        }

    2)調用某控件或窗體的CreateGraphics方法以獲取對Graphics對象的引用,該對象表示該控件或窗體的繪圖圖面。如果想在已存在的窗體上或控件上繪圖,應該使用此方法。 
Graphics g; 
g = this.CreateGraphics();

    3)由從Image繼承的任何對象創建Graphics對象。此方法在需要更改已存在的圖像時十分有用。 
Bitmap myBitmap = new Bitmap(@"c:/pic.bmp"); 
Graphics g = Graphics.FromImage(myBitmap);

    此後,可以應用於繪製線條和形狀,呈現文本或顯示與操作圖像。與Graphics對象一起使用的主要有Pen類,Brush類,Font類,Color類。

    1)Pen使用: 
       private void Form1_Paint(object sender, PaintEventArgs e) 
        { 
            Graphics g = e.Graphics; 
            Pen myPen = new Pen(Color.Blue); 
            g.DrawLine(myPen, 100, 100, 200, 200);//畫一條直線 
            myPen.Dispose(); 
            g.Dispose(); 
        } 
    2)Font類使用:在窗體上描繪文本,可以藉助Font類來實現。可以用Graphics的DrawString方法描繪文本。 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Graphics g = this.CreateGraphics(); 
            string str = "使用DrawString方法"; 
             Font myFont = new Font("黑體",20); 
             Brush b = new SolidBrush(Color.Blue); 
             float x = 50.0f; 
             float y = 50.0f; 
             StringFormat myFormat = new StringFormat(); 
             g.DrawString(str, myFont, b, x, y, myFormat); 
             myFormat.Dispose(); 
             myFont.Dispose(); 
             g.Dispose(); 
        } 
    3)位圖類Bitmap類:創建一個Image類的新對象,創建一個Graphics對象類引用要使用的繪圖圖面,然後調用Graphics對象的DrawImage方法,這樣將在圖形類所表示的繪圖表面上繪製圖像。

90.MonthCalendar:可用鼠標拖曳,選擇一段連續的時間,使用selectionstart和selectionend表示。 
91.DateTimePicker控件:選擇日期和時間,只能選擇一個時間,而不是連續的時間段。 
    DateTimePicker.Value.DayofYear ,本年的第多少天 。

92.TreeView控件:屬性選擇Nodes屬性。 
       private void button1_Click(object sender, EventArgs e) 
        { 
            treeView1.Nodes.Clear();

            if (Directory.Exists(textBox1.Text.Trim())) 
            { 
                //先添加根節點爲輸入的目錄 
                treeView1.Nodes.Add(textBox1.Text.Trim()); 
                //顯示根節點所代表的目錄下的子文件夾 
                PopulateTreeView(textBox1.Text.Trim(),treeView1.Nodes[0]); 
            } 
            else 
            { 
                MessageBox.Show(textBox1.Text + "not found "); 
            } 
        }

        string subStringDirectory; 
        public void PopulateTreeView(string directoryValue, TreeNode parentNode) 
        { 
            //存儲目錄的子目錄, 
            // 該方法只返回一級子目錄 
            // 之後採用遞歸的方法,列出其所有子目錄 
            string[] directoryArray = Directory.GetDirectories(directoryValue); 
            //列出當前目錄的子目錄 
            // 返回值 
            //類型: array            //path 中子目錄名稱的數組。 
            try 
            { 
                if (directoryArray.Length != 0) 
                { 
                    //對於每個子目錄創建一個節點 
                    //對該目錄下的文件夾再創建一個節點 
                    // 對所有文件夾再執行PopulateTreeView方法,顯示其子目錄 
                    // 
                    foreach (string directory in directoryArray) 
                    { 
                        listBox1.Items.Add(directory); 
                        //從完整的路徑名中獲取尾部的有效文件夾名稱 
                        // 通過查找“/“實現. 
                        // 如果找到該字符,則爲 value 的從零開始的索引位置;如果未找到,則爲 -1。 
                        subStringDirectory = directory.Substring(directory.LastIndexOf('//') + 1, directory.Length - directory.LastIndexOf('//') - 1); 
                        //爲當目錄創建節點 
                        TreeNode myNode = new TreeNode(subStringDirectory); 
                        //添加當前節點到treeview控件中 
                        parentNode.Nodes.Add(myNode); 
                        //列出子目錄的文件夾 
                       // PopulateTreeView(directory, myNode); 
                    } 
                } 
            } 
            catch (UnauthorizedAccessException) 
            { 
                parentNode.Nodes.Add("Access denied "); 
            } 
        }

93.TabControl控件通過一個個的標籤分門別類的顯示不同的內容。

94.Windows媒體播放器 
            openFileDialog1.ShowDialog(); 
            axWindowsMediaPlayer1.URL = openFileDialog1.FileName; 
95.LINQ,WPF,WCF ,WF是.NET 3.5 框架新添加的4大組件。其中,LINQ是專門的用戶數據查詢技術,WPF是微軟推出的開發windows客戶端程序的下一代工具。WCF是微軟爲構建面向服務的應用程序而提供的統一編程模型。WF是一個數據流模型,可以部署項目的簡要步驟和過程。 
Windows Presentation Foundation 是微軟推出的下一代顯示系統,關鍵作用是生成能帶給用戶震撼視覺體驗的windows客戶端應用程序。 
    WPF提供兩種應用程序模型,即獨立應用程序和用於瀏覽器承載的應用程序。

96.Windows窗體應用程序與數據庫應用 
    1)添加BindingSource控件,編輯DataSource屬性。 
    2)添加數據綁定控件:Textbox ,修改DataBindings屬性,使其綁定數據表的某項。 
    3)添加BindingNavigator控件,設置BindingSource屬性,使其與textbox控件的BindingSource屬性相同。即可查詢所有表中的記錄。

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