C# 語言入門基礎(chǔ)介紹
前言:
C#(讀作“See Sharp”)是一種新式編程語言,不僅面向?qū)ο?,還類型安全。 開發(fā)人員利用 C# 能夠生成在 .NET 中運(yùn)行的多種安全可靠的應(yīng)用程序。 C# 源于 C 語言系列,C、C++、Java 和 JavaScript 程序員很快就可以上手使用。 本教程概述了 C# 8 及更高版本中該語言的主要組件。
C# 是面向?qū)ο蟮?、面向組件的編程語言。 C# 提供了語言構(gòu)造來直接支持這些概念,讓 C# 成為一種非常自然的語言,可用于創(chuàng)建和使用軟件組件。 自誕生之日起,C# 就添加了支持新工作負(fù)載和新興軟件設(shè)計實踐的功能。 C# 本質(zhì)上是面向?qū)ο蟮恼Z言。_* 你需要定義類型及其行為。
多項 C# 功能有助于創(chuàng)建可靠且持久的應(yīng)用程序。 垃圾回收自動回收不可訪問的未用對象所占用的內(nèi)存。 可以為 null 的類型可防范不引用已分配對象的變量。 異常處理提供了一種結(jié)構(gòu)化且可擴(kuò)展的方法來進(jìn)行錯誤檢測和恢復(fù)。 Lambda
表達(dá)式支持函數(shù)編程技術(shù)。 語言集成查詢 (LINQ) 語法創(chuàng)建一個公共模式,用于處理來自任何源的數(shù)據(jù)。 異步操作語言支持提供用于構(gòu)建分布式系統(tǒng)的語法。 C# 有統(tǒng)一類型系統(tǒng)。 所有 C# 類型(包括 int
和 double
等基元類型)均繼承自一個根 object 類型。 所有類型共用一組通用運(yùn)算。 任何類型的值都可以一致地進(jìn)行存儲、傳輸和處理。 此外,C# 還支持用戶定義的引用類型和值類型。 C# 允許動態(tài)分配輕型結(jié)構(gòu)的對象和內(nèi)嵌存儲。 C# 支持泛型方法和類型,因此增強(qiáng)了類型安全性和性能。 C# 可提供迭代器,使集合類的實現(xiàn)者可以定義客戶端代碼的自定義行為。
C# 強(qiáng)調(diào)版本控制,以確保程序和庫以兼容方式隨時間推移而變化。 C# 設(shè)計中受版本控制加強(qiáng)直接影響的方面包括:單獨的 virtual
和 override
修飾符,關(guān)于方法重載決策的規(guī)則,以及對顯式接口成員聲明的支持。
一、.NET 體系結(jié)構(gòu)
C# 程序在 .NET 上運(yùn)行,而 .NET 是名為公共語言運(yùn)行時 (CLR) 的虛執(zhí)行系統(tǒng)和一組類庫。 CLR 是 Microsoft 對公共語言基礎(chǔ)結(jié)構(gòu) (CLI) 國際標(biāo)準(zhǔn)的實現(xiàn)。 CLI 是創(chuàng)建執(zhí)行和開發(fā)環(huán)境的基礎(chǔ),語言和庫可以在其中無縫地協(xié)同工作。
用 C# 編寫的源代碼被編譯成符合 CLI 規(guī)范的中間語言 (IL)。 IL 代碼和資源(如位圖和字符串)存儲在擴(kuò)展名通常為 .dll 的程序集中。 程序集包含一個介紹程序集的類型、版本和區(qū)域性的清單。
執(zhí)行 C# 程序時,程序集將加載到 CLR。 CLR 會直接執(zhí)行實時 (JIT) 編譯,將 IL 代碼轉(zhuǎn)換成本機(jī)指令。 CLR 可提供其他與自動垃圾回收、異常處理和資源管理相關(guān)的服務(wù)。 由 CLR 執(zhí)行的代碼有時稱為“托管代碼”。 “非托管代碼”編譯為面向特定平臺的本機(jī)語言。
語言互操作性是 .NET 的一項重要功能。 C# 編譯器生成的 IL 代碼符合公共類型規(guī)范 (CTS)。 通過 C# 生成的 IL 代碼可以與通過 .NET 版本的 F#、Visual Basic、C++ 生成的代碼進(jìn)行交互。 還有 20 多種與 CTS 兼容的語言。 單個程序集可包含多個用不同 .NET 語言編寫的模塊。 這些類型可以相互引用,就像它們是用同一種語言編寫的一樣。
除了運(yùn)行時服務(wù)之外,.NET 還包含大量庫。 這些庫支持多種不同的工作負(fù)載。 它們已整理到命名空間中,這些命名空間提供各種實用功能。 這些功能包括文件輸入輸出、字符串控制、XML 分析、Web 應(yīng)用程序框架和 Windows 窗體控件。 典型的 C# 應(yīng)用程序廣泛使用 .NET 類庫來處理常見的“管道”零碎工作。
二、Hello world
“Hello, World”
程序歷來都用于介紹編程語言。
下面展示了此程序的 C# 代碼:
using System; class Hello { static void Main() { Console.WriteLine("Hello, World"); } }
“Hello, World”
程序始于引用 System
命名空間的 using 指令。 命名空間提供了一種用于組織 C# 程序和庫的分層方法。 命名空間包含類型和其他命名空間。例如,System
命名空間包含許多類型(如程序中引用的 Console 類)和其他許多命名空間(如 IO 和 Collections
)。 借助引用給定命名空間的 using 指令,可以非限定的方式使用作為相應(yīng)命名空間成員的類型。 由于使用 using 指令,因此程序可以使用 Console.WriteLine
作為 System.Console.WriteLine
的簡寫。
“Hello, World”
程序聲明的 Hello 類只有一個成員,即 Main 方法。 Main 方法使用 static 修飾符進(jìn)行聲明。 實例方法可以使用關(guān)鍵字 this 引用特定的封閉對象實例,而靜態(tài)方法則可以在不引用特定對象的情況下運(yùn)行。 按照約定,Main
靜態(tài)方法是 C# 程序的入口點。
程序的輸出是由 System 命名空間中 Console
類的 WriteLine
方法生成。 此類由標(biāo)準(zhǔn)類庫提供。默認(rèn)情況下,編譯器會自動引用標(biāo)準(zhǔn)類庫。
三、類型和變量
類型定義 C# 中的任何數(shù)據(jù)的結(jié)構(gòu)和行為。 類型的聲明可以包含其成員、基類型、它實現(xiàn)的接口和該類型允許的操作。 變量是用于引用特定類型的實例的標(biāo)簽。
C# 有兩種類型:值類型 和 引用類型。 值類型的變量直接包含它們的數(shù)據(jù)。 引用類型的變量存儲對數(shù)據(jù)(稱為“對象”)的引用。 對于引用類型,兩個變量可以引用同一個對象;對一個變量執(zhí)行的運(yùn)算可能會影響另一個變量引用的對象。 借助值類型,每個變量都有自己的數(shù)據(jù)副本;因此,對一個變量執(zhí)行的運(yùn)算不會影響另一個變量(ref 和 out 參數(shù)變量除外)。
標(biāo)識符為變量名稱。 標(biāo)識符是不包含任何空格的 unicode
字符序列。 如果標(biāo)識符的前綴為 @,則該標(biāo)識符可以是 C# 保留字。 在與其他語言交互時,使用保留字作為標(biāo)識符很有用。
C# 的值類型進(jìn)一步分為:簡單類型、枚舉類型、結(jié)構(gòu)類型、可以為 null
的值類型和元組值類型。 C# 引用類型又細(xì)分為類類型、接口類型、數(shù)組類型和委托類型。
C# 程序使用 類型聲明 創(chuàng)建新類型。 類型聲明指定新類型的名稱和成員。 用戶可定義以下六種 C# 類型:類類型、結(jié)構(gòu)類型、接口類型、枚舉類型、委托類型和元組值類型。 還可以聲明 record
類型(record struct
或 record class
)。 記錄類型具有編譯器合成成員。 記錄主要用于存儲值,關(guān)聯(lián)行為最少。
class
類型定義包含數(shù)據(jù)成員(字段)和函數(shù)成員(方法、屬性及其他)的數(shù)據(jù)結(jié)構(gòu)。 類類型支持單一繼承和多形性,即派生類可以擴(kuò)展和專門針對基類的機(jī)制。
struct 類型定義包含數(shù)據(jù)成員和函數(shù)成員的結(jié)構(gòu),這一點與類類型相似。 不過,與類不同的是,結(jié)構(gòu)是值類型,通常不需要進(jìn)行堆分配。 結(jié)構(gòu)類型不支持用戶指定的繼承,并且所有結(jié)構(gòu)類型均隱式繼承自類型 object
。
interface 類型將協(xié)定定義為一組已命名的公共成員。 實現(xiàn) interface
的 class
或 struct
必須提供接口成員的實現(xiàn)代碼。 interface
可以繼承自多個基接口,class 和 struct 可以實現(xiàn)多個接口。
delegate 類型表示引用包含特定參數(shù)列表和返回類型的方法。 通過委托,可以將方法視為可分配給變量并可作為參數(shù)傳遞的實體。 委托類同于函數(shù)式語言提供的函數(shù)類型。 它們還類似于其他一些語言中存在的“函數(shù)指針”概念。 與函數(shù)指針不同,委托是面向?qū)ο笄翌愋桶踩摹?br />
class
、struct
、interface
和 delegate
類型全部都支持泛型,因此可以使用其他類型對它們進(jìn)行參數(shù)化。
C# 支持任意類型的一維和多維數(shù)組。 與上述類型不同,數(shù)組類型無需先聲明即可使用。 相反,數(shù)組類型是通過在類型名稱后面添加方括號構(gòu)造而成。 例如,int[] 是 int 類型的一維數(shù)組,int[,] 是 int 類型的二維數(shù)組,int[][] 是由 int 類型的一維數(shù)組或“交錯”數(shù)組構(gòu)成的一維數(shù)組。
可以為 null 的類型不需要單獨定義。 對于所有不可以為 null 的類型 T,都有對應(yīng)的可以為 null 的類型 T?,后者可以包含附加值 null。 例如,int? 是可保存任何 32 位整數(shù)或 null 值的類型,string? 是可以保存任何 string 或 null 值的類型。
C# 采用統(tǒng)一的類型系統(tǒng),因此任意類型的值都可視為 object。 每種 C# 類型都直接或間接地派生自 object 類類型,而 object 是所有類型的最終基類。 只需將值視為類型 object,即可將引用類型的值視為對象。 通過執(zhí)行 裝箱 和 取消裝箱操作,可以將值類型的值視為對象。 在以下示例中,int 值被轉(zhuǎn)換成 object,然后又恢復(fù)成 int。
int i = 123; object o = i; // Boxing int j = (int)o; // Unboxing
將值類型的值分配給 object
對象引用時,會分配一個“箱”來保存此值。 該箱是引用類型的實例,此值會被復(fù)制到該箱。 相反,當(dāng) object 引用被顯式轉(zhuǎn)換成值類型時,將檢查引用的 object
是否是具有正確值類型的箱。 如果檢查成功,則會將箱中的值復(fù)制到值類型。
C# 的統(tǒng)一類型系統(tǒng)實際上意味著“按需”將值類型視為 object
引用。 鑒于這種統(tǒng)一性,使用類型 object 的常規(guī)用途庫可以與派生自 object
的所有類型結(jié)合使用,包括引用類型和值類型。
C# 有多種 變量,其中包括字段、數(shù)組元素、局部變量和參數(shù)。 變量表示存儲位置。 每個變量都具有一種類型,用于確定可以在變量中存儲哪些值,
如下文所述:
不可以為 null
的值類型
- 具有精確類型的值
可以為 null 的值類型
- null 值或具有精確類型的值
object
- null 引用、對任意引用類型的對象的引用,或?qū)θ我庵殿愋偷难b箱值的引用
類類型
- null 引用、對類類型實例的引用,或?qū)ε缮灶愵愋偷念悓嵗囊?br />
接口類型
- null 引用、對實現(xiàn)接口類型的類類型實例的引用,或?qū)崿F(xiàn)接口類型的值類型的裝箱值的引用
數(shù)組類型
- null 引用、對數(shù)組類型實例的引用,或?qū)嫒莸臄?shù)組類型實例的引用
委托類型
- null 引用或?qū)嫒莸奈蓄愋蛯嵗囊?/li>
四、程序結(jié)構(gòu)
C# 中的關(guān)鍵組織結(jié)構(gòu)概念包括程序、命名空間、類型、成員和程序集* 。 程序聲明類型,而類型則包含成員,并被整理到命名空間中。 類型示例包括類、結(jié)構(gòu)和接口。 成員示例包括字段、方法、屬性和事件。 編譯完的 C# 程序?qū)嶋H上會打包到程序集中。 程序集的文件擴(kuò)展名通常為 .exe 或 .dll,具體視其分別實現(xiàn)的是應(yīng)用程序還是庫_***而定。
作為一個小示例,請考慮包含以下代碼的程序集:
namespace Acme.Collections; public class Stack<T> { Entry _top; public void Push(T data) { _top = new Entry(_top, data); } public T Pop() { if (_top == null) { throw new InvalidOperationException(); } T result = _top.Data; _top = _top.Next; return result; } class Entry { public Entry Next { get; set; } public T Data { get; set; } public Entry(Entry next, T data) { Next = next; Data = data; } } }
此類的完全限定的名稱為 Acme.Collections.Stack
。
?此類包含多個成員:一個 _top 字段、兩個方法(Push 和 Pop)和一個 Entry 嵌套類。 Entry
類還包含三個成員:一個名為 Next 的屬性、一個名為 Data 的屬性和一個構(gòu)造函數(shù)。 Stack
是泛型類。 它具有一個類型參數(shù) T,在使用時替換為具體類型。
堆棧是一個“先進(jìn)后出”(FILO) 集合。 添加到堆棧頂部的新元素。 刪除元素時,將從堆棧頂部刪除該元素。 前面的示例聲明定義堆棧的存儲和行為的 Stack 類型。 可以聲明一個引用 Stack 類型的實例的變量來使用該功能。
程序集包含中間語言 (IL) 指令形式的可執(zhí)行代碼和元數(shù)據(jù)形式的符號信息。 執(zhí)行前,.NET 公共語言運(yùn)行時的實時 (JIT) 編譯器會將程序集中的 IL 代碼轉(zhuǎn)換為特定于處理器的代碼。
由于程序集是包含代碼和元數(shù)據(jù)的自描述功能單元,因此無需在 C# 中使用 #include 指令和頭文件。 只需在編譯程序時引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共類型和成員。
例如,此程序使用 acme.dll 程序集中的 Acme.Collections.Stack 類:
class Example { public static void Main() { var s = new Acme.Collections.Stack<int>(); s.Push(1); // stack contains 1 s.Push(10); // stack contains 1, 10 s.Push(100); // stack contains 1, 10, 100 Console.WriteLine(s.Pop()); // stack contains 1, 10 Console.WriteLine(s.Pop()); // stack contains 1 Console.WriteLine(s.Pop()); // stack is empty } }
若要編譯此程序,需要引用包含前面示例中定義的堆棧類的程序集。
C# 程序可以存儲在多個源文件中。 在編譯 C# 程序時,將同時處理所有源文件,并且源文件可以自由地相互引用。 從概念上講,就好像所有源文件在被處理之前都連接到一個大文件。 在 C# 中永遠(yuǎn)都不需要使用前向聲明,因為聲明順序無關(guān)緊要(極少數(shù)例外情況除外)。 C# 并不限制源文件只能聲明一種公共類型,也不要求源文件的文件名必須與其中聲明的類型相匹配。
到此這篇關(guān)于C# 語言入門基礎(chǔ)介紹的文章就介紹到這了,更多相關(guān)C# 語言介紹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# FileStream實現(xiàn)多線程斷點續(xù)傳
這篇文章主要為大家詳細(xì)介紹了C# FileStream實現(xiàn)多線程斷點續(xù)傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03C# datatable 不能通過已刪除的行訪問該行的信息處理方法
采用datatable.Rows[i].Delete()刪除行后再訪問該表時出現(xiàn)出現(xiàn)“不能通過已刪除的行訪問該行的信息”的錯誤2012-11-11C#實現(xiàn)利用Windows API讀寫INI文件的方法
這篇文章主要介紹了C#實現(xiàn)利用Windows API讀寫INI文件的方法,涉及C#針對ini文件的創(chuàng)建、讀取及寫入等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07Unity Shader實現(xiàn)新手引導(dǎo)遮罩鏤空效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)新手引導(dǎo)遮罩鏤空效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02