C#簡介
C#(讀作“See Sharp”)微軟公司開發(fā)的一種面向對象且運行在.NetFramwork之上的高級程序設計語言宇攻。 開發(fā)人員利用 C# 能夠生成在 .NET 生態(tài)系統(tǒng)中運行的多種安全可靠的應用程序惫叛。 C# 源于 C 語言系列,C逞刷、C++嘉涌、Java 和 JavaScript 程序員很快就可以上手使用。
重要特性:
- 布爾條件(Boolean Conditions)
- 自動垃圾回收(Automatic Garbage Collection)
- 標準庫(Standard Library)
- 組件版本(Assembly Versioning)
- 屬性(Properties)和事件(Events)
- 委托(Delegates)和事件管理(Events Management)
- 易于使用的泛型(Generics)
- 索引器(Indexers)
- 條件編譯(Conditional Compilation)
- 簡單的多線程(Multithreading)
- LINQ 和 Lambda 表達式
- 集成 Windows
第一個程序
在VS中新建一個控制臺夸浅,輸入兩個數(shù)字仑最,輸出數(shù)字相乘的結果。
1帆喇、創(chuàng)建新項目警医;
2、選擇控制臺;
3预皇、配置項目信息侈玄;
4、開始編碼吟温;
語法
using 關鍵字:
using 關鍵字用于在程序中包含命名空間序仙。一個程序可以包含多個 using 語句。
命名空間(Namespace):
設計目的是提供一種讓一組名稱與其他名稱分隔開的方式溯街。在一個命名空間中聲明的類的名稱與另一個命名空間中聲明的相同的類的名稱不沖突诱桂。
class 關鍵字:
class 關鍵字用于聲明一個類。
成員變量:
變量是類的屬性或數(shù)據(jù)成員呈昔,用于存儲數(shù)據(jù)。
成員函數(shù):
函數(shù)是一系列執(zhí)行指定任務的語句友绝。類的成員函數(shù)是在類內(nèi)聲明的堤尾。
變量
變量是一個名稱,表示程序執(zhí)行時存儲在內(nèi)存中的數(shù)據(jù)迁客。每個變量都有特定的類型郭宝,類型決定了變量的內(nèi)存大小和分布,可以對變量進行一系列操作掷漱。
變量聲明:
變量在使用之前必須聲明粘室。變量聲明定義了變量,并完成兩件事:
1卜范、給變量命名衔统,并為它關聯(lián)一種類型;
2海雪、讓編譯器為它分配一塊內(nèi)存锦爵。
一個簡單的變量聲明至少需要一個類型和一個名稱。
變量的作用域:
變量的作用域是可以訪問該變量的代碼區(qū)域奥裸,一般情況下险掀,確定作用域遵循以下規(guī)則:
1.局部變量存在于表示聲明該變量的塊語句或方法結束的右花括號之前的作用域內(nèi)。
2.在for湾宙、while或類似語句中聲明的局部變量存在地該循環(huán)體內(nèi)樟氢。
變量初始化
變量通過在等號后跟一個常量表達式進行初始化(賦值)。初始化的一般語法為:
控制臺輸入輸出
Console.ReadLine()方法: 從控制臺窗口讀取一行文本侠鳄,返回string值
Console.ReadKey()方法: 監(jiān)聽鍵盤事件埠啃,可以理解為按任意鍵執(zhí)行
Console.Write()方法: 將制定的值寫入控制臺窗口
Console.WriteLine()方法: 將制定的值寫入控制臺窗口凝危,但在輸出結果的最后添加一個換行符
數(shù)據(jù)類型
基本數(shù)據(jù)類型(不止這些)
浮點類型(即有小數(shù)點的)
布爾類型
C#的基本類型布爾(boolean)類型bool啦辐,也稱條件類型置逻,bool的BLC名稱為System.Boolen爹橱。
包含兩個值:true和false抖僵。
只需要1bit的存儲空間,但運行時會使用1byte內(nèi)存(運行時和處理器可以高效操作的最小塊)
字符串
創(chuàng)建 String 對象
可以使用以下方法之一來創(chuàng)建 string 對象:
1.通過給 String 變量指定一個字符串
2.通過使用 String 類構造函數(shù)
3.通過使用字符串串聯(lián)運算符( + )
4.通過檢索屬性或調(diào)用一個返回字符串的方法
5.通過格式化方法來轉換一個值或對象為它的字符串表示形式
數(shù)組(Array)
數(shù)組是一個存儲相同類型元素的固定大小的順序集合暂氯。數(shù)組是用來存儲數(shù)據(jù)的集合秸侣,通常認為數(shù)組是一個同一類型變量的集合。
數(shù)組中某個指定的元素是通過索引來訪問的罢绽,所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成的畏线。最低的地址對應第一個元素,最高的地址對應最后一個元素良价。
聲明數(shù)組
datatype[] arrayName;
datatype 用于指定被存儲在數(shù)組中的元素的類型寝殴。
[ ] 指定數(shù)組的秩(維度)。秩指定數(shù)組的大小明垢。
arrayName 指定數(shù)組變量的名稱蚣常。
初始化數(shù)組
聲明一個數(shù)組不會在內(nèi)存中初始化數(shù)組。當初始化數(shù)組變量時痊银,可以賦值給數(shù)組抵蚊。
數(shù)組是一個引用類型,所以需要使用 new 關鍵字來創(chuàng)建數(shù)組的實例溯革。
double[] balance = new double[10];
賦值給數(shù)組
double[] balance = new double[10];
示例1:balance[0] = 4500.0;
示例2:double[] balance = { 2340.0, 4523.69, 3421.0};
示例3:int [] marks = new int[5] { 99, 98, 92, 97, 95};
示例4:int [] marks = new int[] { 99, 98, 92, 97, 95};
訪問數(shù)組元素
元素是通過帶索引的數(shù)組名稱來訪問的贞绳。這是通過把元素的索引放置在數(shù)組名稱后的方括號中來實現(xiàn)的。
double salary = balance[9];
枚舉
枚舉是一組命名整型常量致稀,使用 enum 關鍵字聲明的冈闭。C# 枚舉是值類型,不能繼承或傳遞繼承抖单。
聲明 enum 變量
聲明枚舉的一般語法:
enum <enum_name>
{
enumeration list
};
- enum_name 指定枚舉的類型名稱萎攒。
- enumeration list 是一個用逗號分隔的標識符列表。
枚舉列表中的每個符號代表一個整數(shù)值臭猜,一個比它前面的符號大的整數(shù)值躺酒。默認情況下,第一個枚舉符號的值是 0.例如:
類型分類
所有C#類型分為以下類別:
值類型
引用類型
通用類型參數(shù)
指針類型
值類型包括大多數(shù)內(nèi)置類型蔑歌,例如羹应,int,long次屠,bool以及自定義結構和枚舉類型园匹。
引用類型包括所有類,數(shù)組劫灶,委托和接口類型裸违。它還包括預定義的 string 類型。
值類型
值類型(Value types)
值類型變量可以直接分配給一個值本昏,它們是從類 System.ValueType 中派生的供汛。
值類型(value type):byte,short,int怔昨,long雀久,float,double趁舀,decimal赖捌,char,bool 和 struct 統(tǒng)稱為值類型矮烹。值類型變量聲明后越庇,不管是否已經(jīng)賦值,編譯器為其分配內(nèi)存奉狈。
常用值類型:
引用類型
引用類型(Reference types)
引用類型不包含存儲在變量中的實際數(shù)據(jù)卤唉,但它們包含對變量的引用,它們指的是一個內(nèi)存位置仁期。使用多個變量時搬味,引用類型可以指向一個內(nèi)存位置。如果內(nèi)存位置的數(shù)據(jù)是由一個變量改變的蟀拷,其他變量會自動反映這種值的變化。內(nèi)置的 引用類型有:object萍聊、dynamic 和 string问芬。
類型轉換
類型轉換方法
C# 提供了下列內(nèi)置的類型轉換方法,如:ToString()寿桨、ToInt32()此衅、ToDateTime()、ToDecimal()亭螟、數(shù)據(jù)類型.Parse()挡鞍、數(shù)據(jù)類型.TryParse()、Convert.ToInt32()等
數(shù)據(jù)類型在一定的條件下是可以相互轉換的预烙,如將int型數(shù)據(jù)轉換成double型數(shù)據(jù)墨微。C#允許使用兩種轉換方式:隱式轉換和顯式轉換。
隱式轉換
任何類型A扁掸,只要其取值范圍完全包含在類型B的取值范圍內(nèi)翘县,就可以隱式轉換為類型B,C#的隱式轉換不會導致數(shù)據(jù)丟失谴分。
顯式轉換
從類型A到類型B的轉換只能在某些情況下進行锈麸,轉換規(guī)則比較復雜,應進行某種類型的額外處理牺蹄。顯式轉換又叫強制類型轉換忘伞,顯式轉換需要用戶明確的指定轉換類型。
注意:
(1)、顯式轉換可能會導致錯誤氓奈,進行這種轉換時編譯器將對轉換進行溢出檢測翘魄。如果有溢出說明轉換失敗,就表明源類型不是一個合法的目標類型探颈。無法進行類型轉換熟丸。
(2)、強制類型轉換會造成數(shù)據(jù)丟失伪节,如上面的例子中光羞,最終得到的d值為10。
裝箱&拆箱
裝箱和拆箱
在值類型和對象之間進行轉換時怀大,CLR必須執(zhí)行裝箱和取消裝箱的過程
裝箱(隱式)在將值類型轉換為引用類型時發(fā)生纱兑。
int i = 1;
object obj = i; // Box the int
拆箱(顯式)在將引用類型轉換為值類型時發(fā)生。
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
拆箱需要顯式強制轉換化借,如果類型不匹配會引發(fā)異常潜慎,比如string轉換為int。
裝箱蓖康、拆箱會有一定的性能代價铐炫,在循環(huán)中要避免這類操作。
null蒜焊、void倒信、可空修飾符
null表明變量不引用任何有效的對象。void表示沒有類型或沒有任何值泳梆。
null只能賦能引用類型鳖悠、指針類型、可空類型优妙。將變量設置為空乘综,會顯示的設置引用,使它不指向任何位置套硼。
void本質(zhì)上不是一個數(shù)據(jù)類型卡辰,它用于指出沒有數(shù)據(jù)類型這一事實。比如函數(shù)沒有返回值熟菲,就需要在數(shù)據(jù)類型位置指定為void看政。
null不能賦給值類型,值類型不能包含引用抄罕,如果要將null賦能值類型允蚣,可以使用可空修飾符。如下:
int? count=null呆贿;
運算符
算術運算符
下表顯示了 C# 支持的所有算術運算符嚷兔。假設變量 A 的值為 10森渐,變量 B 的值為 20,則:
關系運算符
下表顯示了 C# 支持的所有關系運算符冒晰。假設變量 A 的值為 10同衣,變量 B 的值為 20,則:
邏輯運算符
下表顯示了 C# 支持的所有邏輯運算符壶运。假設變量 A 為布爾值 true耐齐,變量 B 為布爾值 false,則:
位運算符
下表列出了 C# 支持的位運算符蒋情。~表示位邏輯非運算埠况、&表示位邏輯與運算、|表示位邏輯或運算棵癣、^表示位邏輯異或運算辕翰、,<<表示位左移運算、>>表示位右移運算狈谊。假設變量 A 的值為 60喜命,變量 B 的值為 13,則:
賦值運算符
賦值運算符的意思是將運算符右側的對象或者數(shù)值傳遞給左側的對象或者變量河劝。
下表列出了 C# 支持的賦值運算符
控制流
判斷
判斷結構要求指定一個或多個要評估或測試的條件壁榕,以及條件為真時要執(zhí)行的語句(必需的)和條件為假時要執(zhí)行的語句(可選的)。
循環(huán)
循環(huán)類型
C# 提供了以下幾種循環(huán)類型赎瞎。
循環(huán)控制語句
循環(huán)控制語句更改執(zhí)行的正常序列护桦。當執(zhí)行離開一個范圍時,所有在該范圍中創(chuàng)建的自動對象都會被銷毀煎娇。
方法和參數(shù)
方法
什么是方法
方法(method)是一種用于實現(xiàn)可以由對象或類執(zhí)行的計算或操作的成員,是一個已命名的語句集贪染。方法就是把一些相關的語句組織到一起缓呛,用來執(zhí)行一個任務的語句塊。
格式:
修飾符 返回值類型 方法名稱 (參數(shù))
{
方法體
}
每個方法都有一個名稱和一個主體杭隙。
方法名稱:是一個有意義的標識符哟绊,應當描述出方法的用途。
方法主體:包含了調(diào)用方法時實際執(zhí)行的語句痰憎。
修飾符:public ,private, static等等票髓。
返回值類型:void, int ,double等等。
參數(shù):方法可有有任務個數(shù)的參數(shù)铣耘,參數(shù)都有特定的數(shù)據(jù)類型洽沟。
值參數(shù)
概念:方法中的值參數(shù)傳遞的類型可以包括“值類型”和“引用類型”。
結論:被調(diào)用方法的參數(shù)在棧上分配內(nèi)存蜗细, 值類型參數(shù)復制值裆操,而引用類型復制對象的引用地址
引用參數(shù)
概念:
1怒详、使用引用參數(shù)時,必須在方法的聲明和調(diào)用中使用ref修飾符踪区。
2昆烁、聲明的傳遞參數(shù)必須是變量,且在調(diào)用前初始化值(值類型) 缎岗。
結論:被調(diào)用方法的參數(shù)不在棧上分配內(nèi)存静尼。實際上該參數(shù)使用的是調(diào)用方法參數(shù)的地址。所以在方法執(zhí)行過程中如果內(nèi)容發(fā)生變化传泊,在方法調(diào)用結束后依然有效鼠渺。
輸出參數(shù)
概念:用于從方法體內(nèi)把數(shù)據(jù)傳出到調(diào)用代碼,它們的行為與引用參數(shù)非常類似或渤。
如同引用參數(shù)系冗,輸出參數(shù)有以下要求:
1、必須在聲明和調(diào)用中都使用修飾符薪鹦。輸出參數(shù)的修飾符是out而不是ref掌敬。
2、和引用參數(shù)相似池磁,實參必須是變量奔害,而不能是其他類型的表達式。
例如地熄,下面的代碼聲明了名稱為MyMethod的方法华临,它帶有單個輸出參數(shù)。
void MyMethod ( out int val )//方法聲明
{
val =100;
...
}
int y = 1;//實參變量
MyMethod ( out y );//方法調(diào)用
out與ref區(qū)別:
out 關鍵字會導致參數(shù)通過引用來傳遞端考。這與 ref 關鍵字類似雅潭,不同之處在于 ref 要求變量必須在傳遞之前進行初始化。若要使用 out 參數(shù)却特,方法定義和調(diào)用方法都必須顯式使用 out 關鍵字扶供。
面向對象
類
類的定義
類的定義是以關鍵字 class 開始,后跟類的名稱裂明。類的主體椿浓,包含在一對花括號內(nèi)。下面是類定義的一般形式:
結構體
在 C# 中闽晦,結構體是值類型數(shù)據(jù)結構扳碍。它使得一個單一變量可以存儲各種數(shù)據(jù)類型的相關數(shù)據(jù)。struct 關鍵字用于創(chuàng)建結構體仙蛉。結構體是用來代表一個記錄笋敞。
定義結構體
定義一個結構體必須使用 struct 語句,struct 語句為程序定義了一個帶有多個成員的新的數(shù)據(jù)類型荠瘪。
類 vs 結構
類和結構有以下幾個基本的不同點:
- 類是引用類型液样,結構是值類型振亮。
- 結構不能繼承其他的結構或類。
- 結構不能聲明默認的構造函數(shù)(無參構造函數(shù))鞭莽。
- 結構可以不使用 New 操作符即可被實例化
接口
接口定義了所有類繼承接口時應遵循的語法合同坊秸。接口定義了語法合同 "是什么" 部分,派生類定義了語法合同 "怎么做" 部分澎怒。
接口定義了屬性褒搔、方法和事件,這些都是接口的成員喷面。接口只包含了成員的聲明星瘾。接口提供了派生類應遵循的標準結構。
定義接口
接口使用 interface 關鍵字聲明惧辈,它與類的聲明類似琳状。接口聲明默認是 public 的。
繼承
繼承是面向對象程序設計中最重要的概念之一盒齿。繼承允許我們根據(jù)一個類來定義另一個類念逞,這使得創(chuàng)建和維護應用程序變得更容易。
當創(chuàng)建一個類時边翁,不需要完全重新編寫新的數(shù)據(jù)成員和成員函數(shù)翎承,只需要設計一個新的類,繼承了已有的類的成員即可符匾。這個已有的類被稱為的基類叨咖,這個新的類被稱為派生類。繼承的思想實現(xiàn)了屬于關系啊胶。例如甸各,哺乳動物屬動物,狗屬于哺乳動物焰坪,因此狗屬于動物痴晦。
基類和派生類
一個類可以派生自多個類或接口,這意味著它可以從多個基類或接口繼承數(shù)據(jù)和函數(shù)琳彩。
C# 中創(chuàng)建派生類的語法如下:
public class 動物
{
public string 顏色;
public void 吃東西()
{
...
}
}
public class 狗 : 動物
{
public void 叫()
{
...
}
}
多重繼承指的是一個類別可以同時從多于一個父類繼承行為與特征的功能。與單一繼承相對部凑,單一繼承指一個類別只可以繼承自一個父類露乏。
C# 不支持多重繼承。但可以使用接口來實現(xiàn)多重繼承涂邀。
封裝
封裝被定義為"把一個或多個項目封閉在一個物理的或者邏輯的包中"瘟仿。在面向對象程序設計方法論中,封裝是為了防止對實現(xiàn)細節(jié)的訪問比勉。
抽象和封裝是面向對象程序設計的相關特性劳较。抽象允許相關信息可視化驹止,封裝則使開發(fā)者實現(xiàn)所需級別的抽象。
C# 封裝根據(jù)具體的需要观蜗,設置使用者的訪問權限臊恋,并通過 訪問修飾符 來實現(xiàn)。
一個訪問修飾符定義了一個類成員的范圍和可見性墓捻。
C# 支持的訪問修飾符如下所示:
public:所有對象都可以訪問抖仅;
private:對象本身在對象內(nèi)部可以訪問;
protected:只有該類對象及其子類對象可以訪問
internal:同一個程序集的對象可以訪問砖第;
protected internal:訪問限于當前程序集或派生自包含類的類型撤卢。
比如說:一個人A為父類,他的兒子B梧兼,妻子C放吩,私生子D(注:D不在他家里)
如果我們給A的事情增加修飾符:
public事件,地球人都知道羽杰,全公開
protected事件渡紫,A,B忽洛,D知道(A和他的所有兒子知道腻惠,妻子C不知道)
private事件,只有A知道
internal事件欲虚,A集灌,B,C知道(A家里人都知道复哆,私生子D不知道)
protected internal事件欣喧,A,B梯找,C唆阿,D都知道,其它人不知道
多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)性意味著有多重形式锈锤。在面向對象編程范式中驯鳖,多態(tài)性往往表現(xiàn)為"一個接口,多個功能"久免。
多態(tài)就是同一個接口浅辙,使用不同的實例而執(zhí)行不同操作,如圖所示:
函數(shù)重載
可以在同一個范圍內(nèi)對相同的函數(shù)名有多個定義阎姥。函數(shù)的定義必須彼此不同记舆,可以是參數(shù)列表中的參數(shù)類型不同,也可以是參數(shù)個數(shù)不同呼巴。不能重載只有返回類型不同的函數(shù)聲明泽腮。
動態(tài)多態(tài)性
C# 允許使用關鍵字 abstract 創(chuàng)建抽象類御蒲,用于提供接口的部分類的實現(xiàn)。當一個派生類繼承自該抽象類時诊赊,實現(xiàn)即完成厚满。抽象類包含抽象方法,抽象方法可被派生類實現(xiàn)豪筝。
當有一個定義在類中的函數(shù)需要在繼承類中實現(xiàn)時痰滋,可以使用虛方法。
虛方法是使用關鍵字 virtual 聲明的续崖。
虛方法可以在不同的繼承類中有不同的實現(xiàn)敲街。
對虛方法的調(diào)用是在運行時發(fā)生的。
動態(tài)多態(tài)性是通過 抽象類 和 虛方法 實現(xiàn)的
異常處理
異常是對程序運行時出現(xiàn)的特殊情況的一種響應严望。異常提供了一種把程序控制權從某個部分轉移到另一個部分的方式多艇。C# 異常處理時建立在四個關鍵詞之上的:try、catch像吻、finally 和 throw峻黍。
- try:一個 try 塊標識了一個將被激活的特定的異常的代碼塊。后跟一個或多個 catch 塊拨匆。
- catch:程序通過異常處理程序捕獲異常姆涩。catch 關鍵字表示異常的捕獲。
- finally:finally 塊用于執(zhí)行給定的語句惭每,不管異常是否被拋出都會執(zhí)行骨饿。例如,如果您打開一個文件台腥,不管是否出現(xiàn)異常文件都要被關閉宏赘。
- throw:當問題出現(xiàn)時,程序拋出一個異常黎侈。使用 throw 關鍵字來完成察署。
語法
可以列出多個 catch 語句捕獲不同類型的異常,以防 try 塊在不同的情況下生成多個異常峻汉。
常用異常類
C# 異常是使用類來表示的贴汪。C# 中的異常類主要是直接或間接地派生于 System.Exception 類。
System.ApplicationException 和 System.SystemException 類是派生于 System.Exception 類的異常類休吠。
System.ApplicationException 類支持由應用程序生成的異常扳埂。
System.SystemException 類是所有預定義的系統(tǒng)異常的基類。
下表列出了一些派生自 Sytem.SystemException 類的預定義的異常類:
自定義異常
為什么要自定義異常類
(1)沒有具體系統(tǒng)異常相對應
(2)不希望在Catch塊中處理
(3)希望能明確標志錯誤種類的異常
自定義異常類定義步驟
繼承自System.ApplicationException類蛛碌,并使用Exception作為后綴名。
示例如下:
推薦閱讀
微軟官方教程:
https://docs.microsoft.com/zh-cn/dotnet/csharp/
https://docs.microsoft.com/zh-cn/dotnet/
w3cschool辖源、騰訊課堂蔚携、菜鳥教程等