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è)計(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ò)誤檢測(cè)和恢復(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)版本控制,以確保程序和庫(kù)以兼容方式隨時(shí)間推移而變化。 C# 設(shè)計(jì)中受版本控制加強(qiáng)直接影響的方面包括:?jiǎn)为?dú)的 virtual 和 override 修飾符,關(guān)于方法重載決策的規(guī)則,以及對(duì)顯式接口成員聲明的支持。
一、.NET 體系結(jié)構(gòu)
C# 程序在 .NET 上運(yùn)行,而 .NET 是名為公共語言運(yùn)行時(shí) (CLR) 的虛執(zhí)行系統(tǒng)和一組類庫(kù)。 CLR 是 Microsoft 對(duì)公共語言基礎(chǔ)結(jié)構(gòu) (CLI) 國(guó)際標(biāo)準(zhǔn)的實(shí)現(xiàn)。 CLI 是創(chuàng)建執(zhí)行和開發(fā)環(huán)境的基礎(chǔ),語言和庫(kù)可以在其中無縫地協(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 還包含大量庫(kù)。 這些庫(kù)支持多種不同的工作負(fù)載。 它們已整理到命名空間中,這些命名空間提供各種實(shí)用功能。 這些功能包括文件輸入輸出、字符串控制、XML 分析、Web 應(yīng)用程序框架和 Windows 窗體控件。 典型的 C# 應(yīng)用程序廣泛使用 .NET 類庫(kù)來處理常見的“管道”零碎工作。
二、Hello world
“Hello, World”程序歷來都用于介紹編程語言。
下面展示了此程序的 C# 代碼:
using System;
class Hello
{
static void Main()
{
Console.WriteLine("Hello, World");
}
}
“Hello, World”程序始于引用 System 命名空間的 using 指令。 命名空間提供了一種用于組織 C# 程序和庫(kù)的分層方法。 命名空間包含類型和其他命名空間。例如,System 命名空間包含許多類型(如程序中引用的 Console 類)和其他許多命名空間(如 IO 和 Collections)。 借助引用給定命名空間的 using 指令,可以非限定的方式使用作為相應(yīng)命名空間成員的類型。 由于使用 using 指令,因此程序可以使用 Console.WriteLine 作為 System.Console.WriteLine 的簡(jiǎn)寫。
“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)類庫(kù)提供。默認(rèn)情況下,編譯器會(huì)自動(dòng)引用標(biāo)準(zhǔn)類庫(kù)。
三、類型和變量
類型定義 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ǎ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ī)用途庫(kù)可以與派生自 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)用程序還是庫(kù)_***而定。
作為一個(gè)小示例,請(qǐ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。
?此類包含多個(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C#實(shí)現(xiàn)讀取系統(tǒng)配置文件的代碼實(shí)例講解
這篇文章主要介紹了使用C#實(shí)現(xiàn)讀取系統(tǒng)配置文件的代碼實(shí)例,使用到了ConfigurationManager類,需要的朋友可以參考下2015-12-12
.NET/C#實(shí)現(xiàn)識(shí)別用戶訪問設(shè)備的方法
這篇文章主要介紹了.NET/C#實(shí)現(xiàn)識(shí)別用戶訪問設(shè)備的方法,結(jié)合實(shí)例形式分析了C#識(shí)別用戶訪問設(shè)備的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
C#難點(diǎn)逐個(gè)擊破(9):類型轉(zhuǎn)換
類型之間的轉(zhuǎn)換可以分為隱式轉(zhuǎn)換與顯式轉(zhuǎn)換,如int類型可直接轉(zhuǎn)換為long類型。2010-02-02
C#中的并發(fā)編程與.NET任務(wù)并行庫(kù)的使用示例和常見問題
在現(xiàn)代軟件開發(fā)中,.NET Framework通過引入任務(wù)并行庫(kù)(TPL)和并發(fā)集合類型,簡(jiǎn)化了并發(fā)復(fù)雜性,提高程序的性能、可維護(hù)性和可擴(kuò)展性,并發(fā)集合設(shè)計(jì)上允許多線程安全訪問,此外,TPL通過Task類簡(jiǎn)化異步操作,正確使用這些工具可避免死鎖和競(jìng)爭(zhēng)條件等常見問題2024-09-09
C# Winform 讓整個(gè)窗口都可以拖動(dòng)
Windows 的 API 果然強(qiáng)大啊.以前要實(shí)現(xiàn)全窗口拖動(dòng), 要寫鼠標(biāo)按下和抬起事件, 很是麻煩, 偶爾還會(huì)出現(xiàn) BUG2011-05-05
利用C#/VB.NET實(shí)現(xiàn)將PDF轉(zhuǎn)為Word
眾所周知,PDF 文檔支持特長(zhǎng)文件,集成度和安全可靠性都較高,可有效防止他人對(duì) PDF 內(nèi)容進(jìn)行更改,所以在工作中深受大家喜愛。本文將分為兩部分介紹如何以編程的方式將 PDF 轉(zhuǎn)換為 Word,需要的可以參考一下2022-12-12
winform開發(fā)使用通用多線程基類分享(以隊(duì)列形式)
多線程這個(gè)概念大家都很熟悉,對(duì)于winform的開發(fā)人員來說,用的還是多的.但估計(jì)都是用Timer,或者backgroundWorker,為大家寫了一個(gè)多線程的基類,只有你用到多線程拿過來就可以用了2013-12-12

