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