C#速学
第一章
?
1、.NET是平臺,C#是.NET上的一門語言。
2、C#的異常處理機制:try? catch? finally
???????? Try? 引發異常? catch捕獲異常??? finally?? 釋放資源
3、catch? finally(錯誤)
問題:.NET? Framework由什么組成?
答:有公共語言運行時(CLR)和.NET Framework基類庫(FCL)這兩大組件組成。
?
第二章? 類、對象、方法
?
1、什么是類:具有相似特性(屬性)和行為(方法)的對象的集合。
2、什么是對象:在現實世界中存在的,并且看得見摸得著的一切事物。
3、類與對象之間的關系:一對多的關系。類是對象的藍圖。
4、面向對象的三大特性:封裝、繼承、多態。
???????? 封裝:隱藏內部實現,穩定外部接口。
???????? 繼承:子類繼承父類的所有成員,實現代碼的復用。
???????? 多態:不同的子類對于同一個消息做出的不同一種反映。
5、類的訪問修飾符:public(公共的)?? Intermal(默認的訪問修飾符)
?? 成員訪問修飾符:
| public | 允許類的使用者從外部進行訪問 |
| private | C#中的私有成員公限于類中的成員可以訪問,從類的外部訪問私有成員是不合法。 |
| protected | 為了方便派生類的訪問,有希望成員對于外界隱藏的,這時可以使用protected修符聲明成員為保護成員。 |
| intemal | 對于同一應用程序是可以訪問的。 |
6、類中分為兩種成員:成員變量(字段,屬性),成員函數(方法)
?? 屬性的作用:1、封裝字段,為字段提供有效的數據驗證。
???????? ???????? ???????? ?? 2、為其他類提供一個外部的訪問接口。
屬性的分類:只讀屬性、只寫屬性、可讀可寫屬性。
7、方法的分類:實例方法、靜態方法、構造方法(構造函數)
???????? 實例方法:當一個類被實例化后,通過類的實例(對象)調用的方法。
???????? 靜態方法:當直接通過類名調用的方法。靜態方法中只能包含靜態成員變量。
???????? 構造方法:當類的實例(對象)被創建的過程中,所調用的方法稱為構造方法。
???????? ???????? 特點:構造方法與類名相同,且沒有反回類型。
8、重載和重寫的概念:
| 重寫(override) | 在面向對象中重新實現父類的虛方法或者抽象對象方法,通過override關鍵字來重寫體現面向對象的多態性。重寫又稱覆蓋。 |
| 重載 | 同一類中添加幾個方法名字相同,參數個數或者參數類型不同的方法,稱為重載,重載與方法的返回類型無關。 |
?
第三章 static、構造函數
1、八大基本數據類型:
類型:
| ? | 數據類型 | 所占字節數 |
| 整型 | int | 4字節 |
| Byte | 1字節 | |
| Short | 2字節 | |
| long | 8字節 | |
| 浮點型 | Double | ? |
| Float | ? | |
| 字符型 | Char | ? |
| String | ? | |
| 布爾型 | Boolean | ? |
2、const:常量是在字段定義時初始化,是靜態賦值。
?? Readonly:只讀的變量,可以在字段初始化或構造函數中動態賦值。
?? 注意: const與readonly不能同時存在。
3、構造函數的概念:函數的名字與類名相同,并且沒有返回值,這樣的函數稱為構造函數
構造函數的作用:
(1)初始化字段或屬性;
(2)用于創建對象。
4、析構函數的概念:用~開頭,函數名和類同名,函數沒有訪問修飾符,函數沒有參數,這樣的函數稱為析構函數
如:~類名(){}
析構函數的調用規則:
(1)?????? 一個類只能有一個析構函數
(2)?????? 析構函數沒有訪問修飾符,沒有參數
(3)?????? 析構函數由C#程序自動調用,程序員不能調用
(4)?????? 析構函數的作用:用于回收無用的對象所占用的內存空間
?
比較構造函數和析構函數調用時間和調用頻率
| 實例 | 構造函數 | 在創建類的每個新實例時調用一次 |
| 析構函數 | 在每個實例被銷毀前調用 | |
| 靜態 | 構造函數 | 只調用一次,在類的任意靜態變量第一次被訪問之前,或在類的任何實例被創建之前,無論兩者誰先發生。 |
| 析構方法 | 不存在,只有實例才有析構方法 |
5、C#中數據類型分類:值類型、引用類型。
值類型:將實際的值保存在內存的棧中。
引用類型:通過指針指向內存棧中實際值的地址。引用類型的本身保存在堆中。
String sl=null;//空引用
Sl=””;//空值
6、關鍵字this公在構造函數、類的方法和類的實例中使用,主要有以下含義:
???????? (1)出現在類的構造函數中的this,表示正在構造的對象本身的引用
???????? (2)出現在類的方法中的this,表示對調用該方法的對象的引用。
第四章?? 索引器、枚舉、結構
1、定義索引器的語法
?? 訪問修飾符? 返回類型? this[數據類型 標識]
{
??? Get{return 內容;}
? ?? Set{}
}
?? 注意:
(1)?????? get{}訪問器中,return后的內容的類型要和定義索引的返回類型一致;
(2)?????? 索引器一般用在將對象作為數組的情況;
(3)?????? [數據類型? 標識]數據類型根據具體情況進行定義;
(4)?????? 根據[]中的不同數據類型根據具體情況進行定義;
(5)?????? 索引器類似于屬性,可以根據下標訪問元素,也包含get{}和set{}訪問器;
(6)?????? 索引器也類似于數組,可以根據下標訪問元素,但索引器比數據更靈活,數據元素只能根據下標訪問,索引器還可以根據其他類型進行訪問。
2、枚舉(enum)是一個指定的常數,其基礎類型可以是任何整型,如果沒有顯示聲明基礎類型,則用int。
枚舉是值類型的一種特殊形式。
枚舉的限制:
(1)?????? 不能定義自己的方法;
(2)?????? 不能實現接口;
(3)?????? 不能定義屬性或索引。
3、結構(struck)是程序員自定義的數據類型,非常類似于類
?? 語法:struck? 結構名稱
?? {
???????? ???????? //結構成員;
}
?
第五章?? 繼承、多態
1、在C#繼承中,如果子類繼承父類,那么子類就必須繼承父類的構造函數。如果父類沒有默認構造函數,那么子類就必須顯示調用父類帶參的構造函數。
2、在C#中,如果子類繼承父類,在實例化子類的時候,首先執行父類的構造函數,再執行子類的構造函數。
3、在C#繼承中,父類可以派生多個子類,子類只能直接繼承一個父類,繼承具有傳遞性以及單根性的特點。
4、創建子類對象時,程序先調用父類無參的構造方法,再調用子類自己的構造方法,無論子類的構造方法是否有參數,始終調用父類無參的構造方法。
5、注意:??????
(1)?????? base關鍵字表示調用父類的構造方法;
(2)?????? base(參數1,參數2,……)中的參數只有參數名,沒有數據類型;
(3)?????? 根據base()中的參數個數決定調用父類的哪個構造方法;
(4)?????? base(參數1,參數2,……)中的參數名要和子類([參數……])中的參數名相同。
6、繼承的特點:單根性和傳遞性。
7、is檢查對象是否與指定類型兼容。
?? as用于在兼容的引用類型之間執行轉換。
?
第六章? 抽象類、接口
1、抽象類(abstract):在C#中通過關鍵字abstract定義的類稱為抽象類。
2、抽象類主要用于類的藍圖或模版。
3、抽象類(abstract)的特點:
(1)?????? 抽象類中既包含抽象方法又包含實例方法;
(2)?????? 有抽象方法的類一定是抽象類;
(3)?????? 抽象類可以被繼承,但是不能被實例化;
(4)?????? 抽象類一般作為基類,子類繼承抽象類,必須實現抽象類中的抽象方法;
(5)?????? 抽象類不能是密封類或靜態類。
?? 抽象方法:只能定義沒有實現的方法稱為抽象方法。
?? 有抽象方法的類一定是抽象類。
?? 當子類繼承的父類是一個抽象類時,子類要么實現父類中所有的抽象方法,要么將自己也聲明為抽象類,子類重寫父類的抽象方法時,必須使用關鍵字override。
?? 抽象類的作用:強制約束子類的行為。
4、密封類(sealed):用關鍵字sealed定義的類為密封類。
?? 密封類的特點:
(1)?????? 類中不能有虛方法;
(2)?????? 密封類不能被其它類繼承。
?? string是密封類,所以不能被繼承。
5、虛方法(virtual):在C#中默認的方法形式都是非虛方法。如果父類的方法被定義為虛方法,那么子類就可以通過override重寫父類的虛方法,否則子類將隱藏(new)父類的方法。
6、接口:接口是單純對事物行為的描述。
?? 接口的作用:實現多重繼承。
?? 接口的特點:為了C#中繼承單根性的擴展。
?? 子類繼承父類,可以實現多個接口。
?? 接口中包含的內容:屬性、方法、索引器、事件。
7、類實現接口的語法:類名:接口名{類成員、方法}。
???注意:當類實現接口時要實現接口中的所有方法。
8、接口的默認修飾符是public,而且public不需要顯示的定義,也不能修改成其它修飾符
?? 注意:
1)? 接口可以繼承接口,當類實現的接口繼承于其它接口時,類需要實現子接口和父接口中的所有定義內容。
2)? 父類實現接口中的方法時將方法定義為虛方法,子類繼承父類時用override關鍵字重寫父類的方法,接口中的方法子類就不需要再實現。
?
比較類與結構的區別
a)?????? 類中字段可以有初始值,結構中字段不可以有初始值。
b)?????? 類中可以包含默認構造函數,結構中不能有顯示定義的默認構造函數,結構體中帶參數構造函數,但是構造函數中的參數必須為所有字段賦值。
c)?????? 類屬于引用類型,結構屬于值類型。
d)?????? 類可以被繼承,結構不能被繼承。
e)?????? 類必須實例化,結構可以實例化也可以不實例化
?
虛方法與抽象方法的區別
?
| 虛方法 | 抽象方法 |
| 用virtual修飾 | 用abstract修飾 |
| 要用方法體,哪怕是一個分號 | 不允許有方法體 |
| 可以被子類override(重寫) | 必須被子類override(重寫) |
| 除了密封類都可以寫 | 只能在抽象類中 |
?
抽象類與接口的區別
| ? | 抽象類 | 接口 |
| 不同點 | 用abstract定義 | 用interface定義 |
| 只能繼承一個類 | 可以實現多個接口 | |
| 非抽象派生類必須實現抽象方法 | 實現接口的類必須實現所有成員 | |
| 需要override實現抽象方法 | 直接實現 | |
| 相似點 | 不能被實例化 | |
| 包含未實現的方法 | ||
| 派生類必須實現未實現的方法 | ||
?
第七章? ListView 和TreeView
?
TreeView中的常用屬性的方法:
屬性?:
1、 nodes:獲取TreeView控件的所有節點集合,返回一個treenodecollection,表示此控件的樹節點集合。
2、 SelectNode:獲取或設置當前在樹視圖控件中選定的樹節點。
3、 ShowNodeTooltips:獲取或設置一個值,當鼠標縣停在TreeNode上時顯示工具示。
TreeView.Node返回的是Treenodecollection類型。
?
Treenodecollection屬性:
1、 count:獲取TreeNode中對象的總數。
TreeNodeCollection方法:
1、 Add()向集合中添加新的樹節點。
2、 Clear()刪除所有樹節點。
TreeView中每一個節點表示一個TreeNode對象
TreeNode常用屬性和方法:
Level屬性:獲取TreeView控件中樹視圖的深度。
Nodes屬性:獲取當前樹節點的TreeView對象的集合。
ToolTipText和ShowNodeToolTips的區別:
方法:
Collapse():折疊TreeNode
CollapseAll():折疊所有的樹節點。
Expand():展開樹節點。
ExpandAll():展開所有子樹節點。
GetNodeCount():返回子樹節點的數目
?
?
AfterSelect事件:選定樹節點時觸發。
?
創建TreeView實例
//創建根節點
TreeNode root=new TreeNode(“根節點名”);
//創建子節點
TreeNode node=new TreeNode(“子節點名”);
//將子節點添加到根節點中
Root.Nodes.Add(node);
//將根節點添加到TreeView控件中
TreeView.Node.Add(root);
?
?
TreeNode對象用于創建節點
節點對象名1.Nodes.Add(節點對象名2)——節點對象名2是對象名1的子節點
節點對象名1.Text——給節點設置文本
注意:TreeView中只需添加根節點
?
ExpandAll()方法展開所有節點
?
SelectedNode屬性得到是選中的TreeNode對象
Level屬性得到一個節點的深度(層次),根節點的深度是0,以此類推。
?
ListView常用屬性及方法
屬性:
View:設置或獲取項在控件中的顯示方式。
FocusedItem:獲取或設置當前具有焦點的控件的項。
Items:獲取包含控件中所有項的集合。
Columns:獲取控件中顯示的所有列標題的集合。
SelectedItems:獲取控件中當前選中的項。
FullRowSelect:制定時某一項還是某一項所在的行。
ListViewItem:屬性的方法
SubItems:獲取包含該項的所有子項的集合。
Text:獲取或設置項的顯示文本。
ToolTipText:獲取或設置當鼠標停留在ListViewItem上時顯示的文本。
ListView常用的方法:
Clear:刪除ListView中的所有的項。
?
創建ListView的實例:
//清空原有項
ListView1.Items.Clear();
//創建ListView對象
ListViewItem item=new ListViewItem(“集點項數據”);
//添加子項
Item.SubItems.Add(“子項數據”);
//向ListView中添加項
ListView1.Items.Add(item);
?
第八章? 委托與事件
委托的定義:委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。委托方法的調用可以像其他任何方法一樣,具有參數的返回值,委托方法將方法作為參數進行引用。
語法:
訪問修飾符? delegate? 返回值類型 委托名();
委托不能被繼承和重載。
委托的簽名:由返回類型和參數值組成。
?
將方法委托給對象的實現步驟:
(1)?? 定義委托:訪問修飾符? delegate 返回值類型 委托名();
(2)?? 定義類,在類中定義方法:
class 類名
{
??? 訪問修飾符? 返回值類型 方法名1(){……}
訪問修飾符? 返回值類型 方法名2(){……}
訪問修飾符? 返回值類型 方法名3(){……}
}
(3)?? 創建類的對象:類名? 對象名 =new 類名();
(4)?? 創建委托對象:
方法一:委托名? 委托對象名=new 委托名(對象名.方法名());
方法二:委托名? 委托對象名=對象名.方法名;
注意:方法后不要帶();
(5)(可選步驟)給委托對象委托多個方法
??? ?如:委托對象名+=對象名.方法名2;
(6)調用委托對象:如
????? 委托對象名();
例:委托的實例:
//定義一個無參無返回值的委托
public delegate void Hello();
//創建委托對象
HelloDel del=new HeelDel(方法名);
//在測試為中調用委托
Del();
?
注意:委托對象名后一定要跟();
??? ? 委托名、類名、方法名1、對象名、委托對象名均由程序員定義
匿名方法:
語法:
Delegate? 參數弄表? {語句塊}
匿名方法實例
//定義委托
Delegate? void Hello()
//通過匿名方法創建委托對象
Hello hello=delegate()
{
??? Console.WriteLine(“hello!”);
}
//調用委托
Hello();
?
?
練習:使用委托,輸出本周和下周的學習安排
將方法給委托對象的規則:
(1)?? 委托的參數類型要和方法的參數類型一致。
(2)?? 可以委托多個有返回值的方法,但委托對象的返回值是最后一個方法的返回值
(3)?? +=表示添加要委托的方法,-=表示去掉已經委托的方法。
練習:定義委托,執行接收一個數字,返回該數字的立方的方法。
?
事件
事件是類在發生其關注的事情時用來提供通知的一種方式。
1、 委托是事件的基礎,事件返回委托的類型。
2、 定義事件的語法:
訪問修飾符? event? 委托名 事件名;
使用事件的步驟:
1) 定義委托,如:訪問修飾符? delegate? 返回值類型 委托名();
2) 定義觸發事件的類及方法,如:
?
class 類名1
{
??? //定義事件
??? 訪問修飾符 event 委托名? 事件名;
??? //定義方法調用事件
??? 訪問修飾符? 返回值類型? 方法名1()
??? {
??? ??? [//代碼部分]
??? ??? //調用事件
??? ??? 事件名();
}
}
?
?
?
3) 定義響應事件的類及方法,如:
class? 類名2
{
??? //定義方法響應事件
??? 訪問修飾符? 返回值類型? 方法名2()
??? {
??? ??? //代碼部分
}
}
?
4) 訂閱事件,如:
//創建響應事件類的對象
??? 類名2? 對象名2=new 類名2();
//將類中方法給委托
委托名? 委托對象名=對象名.方法名2;
//創建角發事件類的對象
??? 類名1? 對象名1=new 類名1();
//將委托加載到事件
??? 對象名1.事件名+=委托對象名;
//調用角發事件的方法
??? 對象名1.方法名1();
this.button1.Click+=new System.EventHandler(this.button1_Click);
注意:委托事件的基礎。
?
事件的事例:
//定義委托
Public delegate void del();
//定義事件
public event del eve;
//定義角發事件的方法
public void begin()
{
??? Console.WriteLine(“處理。”);
}
//定義訂閱事件的方法
public void DingYue()
{
??? eve+=new del(chuli);
}
?
?
?
?
第十章?? 文件操作
?
File 類——操作文件,是一個靜態類
??? 主要提供用于創建、復制、刪除、移動和打開文件的靜態方法,其更側重于對文件的操作。
File類是一個密封類,不能被繼承。其所有成員皆是靜態的,可以不要創建實例
File類的常用方法
?
Create(路徑及文件名.后綴)——創建文件
delete(路徑及文件名.后綴)——刪除文件
exists(路徑及文件名.后綴)——判斷文件是否存在,存在返回true,不存在返回false。
copy(源文件路徑,目標文件路徑)——復制文件
move(源文件路徑,目標文件路徑)——移動文件(相當于剪切和粘貼)
OpenWrite(路徑及文件名.后綴)——以寫入的方式打開文件
?
練習:在E盤下創建文件:學習計劃.txt,然后將文件移動到D盤,再判斷D盤下是否存在該文件,如果存在,將文件刪除。
?
創建文件的實例:
//聲明一個變量,存儲路徑
string?path=@“E:\test.txt”
//判斷文件是否存在
if(File.Exists(path))
{
??? //如果存在則刪除
??? File.Delete(path);
}
else
{
??? //創建文件
??? File.Create(path);
}
?
//向文件中寫入內容的操作步驟
(1)?? 打開文件(可以判斷,如果文件不存在則先創建,如果存在則以寫的方式打開);
(2)?? 將要寫進文件的內容用字節數組保存;
(3)?? 調用文件流的Write()方法將內容寫進文件;
(4)?? 關閉文件流。
?
用FileStream向文件中寫入內容的實例:
//創建一個文件流
FileStream fs=null;
//創建一個FileStream對象
fs=new FileStream(“E:\test.text”,FileModel.OpenOrCreate);//使用指定的路徑和創建模式初始化
?
FileStream類的新實例。
將字符串按UTF8的編碼方式轉換為字節數組:
byte[] array=new UTF8Encoding(true).GetBytes(“內容”);
Encoding.Default.GetBytes(內容)——使用系統默認的字符集將內容轉換成字節數組
?
寫入內容
fs.write(“寫入的內容”,0,“寫入字節長度”);緩沖區讀取的數據將字節塊寫入該流,0:從零開始的字節偏一,從此處開始將字節復制到當前流。
//清空緩沖區
fs.flush();
//關閉流
fs.Close();
?
?
從文件中讀取內容的操作步驟:
(1)?? 打開文件(可以判斷文件是否存在)
(2)?? 定義字節數組
(3)?? 調用文件流的Read()方法,將文件中的內容讀取到字節數組
(4)?? 將字節數組轉換后輸出
(5)?? 關閉文件流
?
練習:向E盤下的“學些計劃.txt”文件寫入學習計劃,然后讀取學習計劃,在控制臺中打印
?
FileInfo類:提供創建、復制、刪除、移動和打開文件的實例方法,FileInfo類屬于sealed密封類,不能被繼承。
FileInfo類的常用屬性
l? Exists ??? ??? ??? ????判斷該文件是否存在
l? Length ??? ??? ??? ??? 文件的大小
l? Name ?? ??? ??? ??? ??? 文件名
l? FullName ?? ??? ??? ??? 文件的完整路徑
l? IsReadOnly ??? ??? ??? 是否為只讀
l? Creationtime ?? ??? ??? 當前文件的創建時間
l? ?
Directory類:提供用于創建、移動、刪除目錄和子目錄的靜態方法
l? Delete? ??? ??? ??? ??? 刪除目錄及其內容
l? Exists? ??? ??? ??? ??? 判斷目錄是否存在
l? GetCurrentDirectory ??? 應用程序的當前工作目錄
l? GetDirectories? ??? ??? 指定目錄中子名稱
l? GetFiles??? ??? ??? ??? 指定目錄的文件名稱
l? Move??? ??? ??? ??? ??? 將目錄移動新的位置
DirectoryInfo類:提供了用于創建、移動、刪除目錄和子目錄的實例方法
l? Create? ??? ??? ??? ??? 創建目錄
l? delete? ??? ??? ??? ??? 刪除DirectoryInfo及其內容
l? GetDirectories? ??? ??? 指定目錄中子目錄的名稱
l? GetFiles??? ??? ??? ??? 指定目錄中的文件名稱
l? MoveTo將DirectoryInfo? 實例及其內容移動到新位置
File類靜態類,FileInfo密封類
使用建議:
(1)?? 如果需要對文件進行多次操作,應FileInfo類,因為在創建對象時就指定了正確的路徑,File中的方法大多是靜態的,每次都需要重新尋找文件,會花費更多資源。
(2)?? 如果公操作文件一次,應使用File類,直接調用方法,無需創建對象。
我的問題:WinForm中的文件與Java中有何區別?
?
?
第十一章 集合與泛型
泛型:List<T>
T表示任意數據類型,用來約束添加到集合中的內容
| ? | ArrayList | List<T> |
| 不同點 | 可以添加任何元素,添加元素時裝箱,讀取元素時拆箱。 | 添加元地有類型的約束,無需裝箱和拆箱。 |
| 相同點 | 可以動態的添加、刪除元素,使用索引引訪問元素。 注意:使用ArrayList的地方均可以用Lit<T>代替。 | |
?
| ? | HashTable | Dictionary<KT,VT> |
| 不同點 | 可以添加任何元素,添加時裝箱,讀取時拆箱 | 添加的元素有類型約束,無需裝箱、拆箱。 |
| 相同點 | 動態的添加、刪除元素,根據鍵訪問元素。 | |
?
泛型集合細解:
Array:
??? Array是所有數組類的基類
??? 創建一個數組的語法:Array a=Array.CreateInstance(typeOf(指定數據類型),大小);
a.Length;數據元素的個數
a.SetValue();給數組元素賦值
a.GetValue();從數組中取得指定下標的元素
a.Sort();給數組元素排序
a.Reverse();翻轉原有數組元素
??? ……
ArrayList:
??? ArrayList(列表集合)是常用的集合類型,他可以動態添加、刪除元素,其大小可以動態變化,他把所有元素都當成object對象引用,因此訪問ArrayList元素時要進行類型轉換。
??? 構造函數:
(1)?? 默認構造函數:ArrayList arrayList=new ArrayList();
(2)?? 添加指定數組到集合中的構造方法:ArralList arrayList=new ArrayList(arrayName);
arrName:數組名字
(3)?? 使用指定大小初始化內部大小的數組構造函數:ArrayList arrayList=new arrayList(n);
n:指定的初駘大小。
??? 添加元素:
??? ??? Add();該方法將對象添加到ArrayList集合的末尾處。
??? ??? Insert();該方法用于將元素插入ArrayList集合的指定索引處。
??? ??? InsertRange();該方法用于將一個數組插入ArrayList集合的指定索引處
??? 刪除元素:
??? ??? Remove();該方法用于將指定名稱的元素從集合中移除
??? ??? RemoveAt();該方法用于將指定索引處的元素從集合中移除。
??? ??? RemoveRange(int index,int count);該方法用于從集合中移除一定范圍的元素
??? ??? ??? ??? ??? ??? index要移除的元素從0開始的索引
??? ??? ??? ??? ??? ??? count要移除的元素的個數
??? ??? Clear();該方法用于從集合中移除所有的元素。
??? 搜索元素:
??? ??? Contains();該方法用于確定指定名稱的元素是否在集合。
??? ??? IndexOf();該方法與string字符串類的同名方法用法作用基本相同
??? HashTable:
??? ??? HashTable(哈希表)是System.Collections命名空間提供的一個集合,可以將數據作為一組鍵/值對來存儲,它的每個元素都是一個存儲在DictionaryEntry對象中的鍵/值對。鍵不能為空,區分大小寫,不能重復;值可以為空,可重復。
??? 構造函數:
(1)?? 默認構造函數:HashTable ht =new hashTable();
(2)?? 使用指定初始容量、默認加在子、默認哈希代碼提供程序和默認比較器初始化HashTable類的新的空實例:HashTable ht=new HashTable(int 初始大小);
添加元素:
??? ??? Add(object Key,object value);將帶有鍵、值的元素添加到HashTable中
刪除元素:
??? ??? Clear();將HashTable中所有元素移除。
??? ??? Remove();將HashTable中帶有指定鍵的元素移除。
搜索元素:
??? ??? ContainsKey();確認是否含有指定鍵。
??? ??? ContainsValue();確認是否含有指定值。
泛型:
??? 泛型一個主要優點是性能,泛型的目標是采用廣泛適用的和可交互性的形式來表示算法和數據結構,以使他們能直接用于軟件構造。泛型能在編譯時提供強大的類型檢查,減少數據類型之間的顯示轉換,裝拆箱操作和運行時的類型檢查,可以強化類型的集合,提高性能。
List<T>
??? ArrayList是一個很方便的集合類,但添加的其中的任何引用或值類型都將隱式轉換為Object類型,強制轉換以及裝拆箱操作都會降低性能。與ArrayList相比,List<T>比它更安全并且速度更快,特別適合列表項是值類型的情況。
??? 構造函數:
??? ??? 默認構造函數:List<T> list=new List<T>();該實例為空并且具有默認初始容量
??? ??? List中,有添加、刪除、插入元素的方法,與ArryList的方法類似,在確定是要使用List還是ArrayList的時候,最好使用List。
?
?
?
第十三章? 序列化和反射
?
序列化:將對象轉換成可存儲格式的過程稱為序列化。
反序列化:將文件中的內容生成對象的過程稱為反序列化。
?
序列化的步驟:
(1)?? 創建要保存的內容:字符串、集合對象、泛型集合對象、對象數組……
(2)?? 創建文件流:FileStream fs=new FileStream(“路徑”,“打開方式”);
(3)?? 創建序列化對象:BinaryFormatter bf=new BinaryFormatter();
(4)?? 調用方法,將內容保存到文件中: bf.Serialize(fs,內容);
(5)?? 清空緩存:fs.Flush();
(6)?? 關閉流件流:fs.Close();
反序列化的步驟:
(1)?? 創建文件流:FileStream fs=new FileStream(“路徑”,“打開方式”);
(2)?? 創建序列化對象:BinaryFormatter bf=new BinaryFormatter();
(3)?? 調用方法,將讀取的內容保存到對應類型的以象中:
數據類型 變量名/對象名=(數據類型)bf.Deserialize(fs);
??? ?(4)?? 清空緩存:fs.Flush();
??? ?(5)?? 關閉文件流:fs.Close();
??? ?(6)?? 輸出變量/對象中的內容。
?
三 層
三層結構:(3W1H)
(一)問題:
1、 什么是三層?
2、 為什么要使用三層?
3、 在哪兒用三層?
4、 怎樣搭建三層?
5、 有哪三層?
??????????????????????????????????????????????????????????????????????
三層在生活中的案例:客戶去茶館吃飯,呼叫服務員點菜,服務員將菜單交給廚師做菜,廚師將做好的菜傳遞給服務員,服務員交給客戶。
?
(二)三層分為:UI(表示層,User Interface)
??? ??? ??? ??? BLL(Business Logic Layer? 業務邏輯層)
??? ??? ??? ??? DAL(Data Access Layer?? 數據訪問層)
(三)三層的依賴關系:
1、 數據訪問層依賴于實體層與數據訪問接口。
2、 業務邏輯層依賴于實體層與數據訪問層。
3、 表示層依賴于實體層與邏輯層。
(四)三層的職責
(五)三層的作用:分工明細,有利于軟件的可維護性與可擴展性。
?
一條記錄,對應一個實體類,一張表的記錄就對應一個泛型集合。
一個表的增刪改操作都保存在DAL類中。
一個業務功能點的實現都需要在BLL類中篩選與驗證,BLL中不包含任何的數據庫操作語句。
?
?
?
QUESTION AND ANSWER
一、imageKey和imageIndex的區別?
??? imageKey:獲取或設置為該項顯示的圖像的鍵。
??? imageIndex:獲取或設置為該項顯示的圖像的索引。
二、什么是重寫和重載?
重寫:在面向對象中,子類繼承父類,子類將父類的抽象方法具體實現或重新實現父類中的虛方法的過程。
??? 重載:方法名相同,參數個數、順序、類型不同。重載與方法的返回類型無關。
三、異常關鍵字解釋
??? try:監控代碼
??? catch:捕獲異常
??? finally:釋放資源,始終都會執行
四、類的默認訪問修飾符?類的訪問修飾符能不能是私有的?
??? 默認的訪問修飾符是:internal。類的訪問修飾符不能是私有的,它只有public和internal兩種。
五、for和foreach的區別?
??? for:是循環,根據下標找元素,可讀可寫。
??? foreach:是遍歷,可讀不可寫(自動遍歷給定的集合體的所有值。)
六、SqlDataAdapter和SqlCommand的區別?
??? SqlDataAdapter是數年開式連接,不用打開,主要用于對sql的查詢
??? SqlCommand需要打開服務器連接同時主要用于對sql的增刪改操作。
七、DataSet和SqlDataReader的區別?
??? DataSet:斷開式連接,一次性填充所有數據到內存中。
??? SqlDataReader:一次只讀取一行記錄,需要一直保護連接,效率高于DataSet。
八、ADO.net常用的組件?
??? Sqlcommand命令對象
??? SqlConnection連接對象
??? SqlDataAdapter數據適配器
??? SqlTransaction表示要在SQL Server中處理Transact-SQL事務。
??? SqlParameter表示SqlCommand的參數,也可以是它到DataSet列的映射。
九、泛型集合的好處?
1、 避免裝拆箱;
2、 提供指定類型;
3、 泛型里有大量的擴展方法,方便查找和操作數據。
十、三層的依關系?
??? 數據訪問層:依賴于實體層和數據訪問接口(補充:實現對數據的保存和讀取操作);
業務邏輯層:依賴于實體層和數據訪問層(補充:是表示層與數據訪問層之間的橋梁,負責數據處理、傳遞)。
??? 表示層:依賴于實體層和業務邏輯層。
十一、什么是裝拆箱?
??? 將值類型轉換為引用類型是裝箱,將引用類型轉換為值類型是拆箱。
十二、靜態類包含的方法一定是靜態方法?
??? 一定是。靜態類不能被實便化。
十三、如何防止一個類不能被繼承?
??? 使用sealed關鍵字,表示密封類。
十四、解釋這個表達式的相關符號
??? Regex reg=new regex(@”[0-9]+(,[0-9]{1})?$”);
^:開始
&:結束
{1}:表示一位小數
+:前面出現的表達式只能是1次或多次
?:前面出現的表達式只能是0次或1次
*:前面出現的表達式只能是0次或多次
十五、屬性的作用?
1、 封裝字段,為字段提供有效的數據驗證;
2、 為其它類提供一個外部的訪問接口。
十六、封裝的作用?
??? 隱藏內部實現,穩定外部接口
十七、show和showDialog的區別?
??? show()可以同時彈出多個窗體(非模式化窗口)
??? showDialog()(模式化窗口)
十八、MessageBox.Show()的返回值是什么類型?
??? DialogResult類型
十九、解釋as和is的使用?
??? as:用于在兼容的引用類型之間執行轉換。
??? is:檢查對象是否與指定類型兼容
二十、public class SQLHelper:DBHelper在子類中通過什么關系字符繼承基類?
??? 在C#中使用:
二十一、FocusedItem表示的是什么?
??? 表示具有焦點的項。
二十二、解釋圖片上傳的相關代碼
??? //打開文件對話框
??? this.openFileImage.ShowDialog()=dialogResult.OK
??? //獲得選擇的圖片路徑
??? string filename=openFileImage.FileName;
??? //FileName:獲取或設置一個包含在文件對話框中選定的文件名的字符串,文件名既包含文件路徑也包含擴展名。
??? //LastIndexOf:在此實例中的最后一個匹配項的索引位置
??? string fileType=filename.SubString(FileName.LastIndexOf(“.”)+1;
//從指定的文件創建image
ptbImage.Image=Image.FromFile(FileName);
this.txtLiuLan.Text=Filename;//把獲取的圖片路徑賦值給瀏覽文本框
//獲取對話框中所選擇文件的文件名和擴展名。文件名不包含路徑
string picName=openFileImage.SafeFileName;
//Application.StartupPath:獲取啟動了應用程序的可執行文件的路徑,返回string類型
//File…Copy方法(string,string,Boolean)將現有文件復制到新文件。true允許覆蓋同名的文件
File.Copy(FileName,Application.StartupPath+@”\images\”+picName,true);
//保存圖片到ImageList圖片集合控件
//@符號的作用:把字符按原樣輸出
?frmBookInfo.ImageList1.Image.Add(picName,Image.FromFile(FileName));
//Image.FromFile返回image類型
二十三、怎樣將至綁定到下拉列表中?隱藏綁定圖書類型的編號有什么用意?
??? //獲取數據源
??? cboType.DataSource=ttypeServers.SelectBookType();
??? //指定顯示的成員名字
??? ?cboType.Displaymember=”BookTypeName”;
??? //指定顯示成員的value屬性
??? cboType.ValueMember=”BookTypeId”;
?隱藏圖書類型編號的用意:以便新增、修改圖書信息時獲取圖書類型編號。
二十四、string類型是否能被繼承?
??? string類型不能被繼承,因為string前面有sealed修飾,它是一個密封類。
二十五、#region、#endregion的意思?
??? 指定可展開或折疊的代碼塊,#region塊必須以#endregion指定終止
二十六、C#是否支持多繼承?
??? C#中不支持多繼承,因為繼承具有單根性。
二十七、結構體是值類型還是引用類型?
??? 是值類型。
二十八、command有哪幾種常用的方法?
??? ExecuteNonQuery()返回的是一個影響的行數,為int類型;
??? ExecuteReader()表示讀取查詢的數據
??? ExecuteScalar()返回第一行第一列的值
?
??? 錯別字難免,勿怪。
(完)
轉載于:https://www.cnblogs.com/sparkleDai/p/7605088.html
總結
- 上一篇: ps里面的批处理教程
- 下一篇: oracle 显示格式化