C#語(yǔ)言主要語(yǔ)言區(qū)域
一、數(shù)組、集合和 LINQ
C# 和 .NET 提供了許多不同的集合類型。 數(shù)組包含由語(yǔ)言定義的語(yǔ)法。 泛型集合類型列在 System.Collections.Generic
命名空間中。 專用集合包括 System.Span<T>
(用于訪問(wèn)堆棧幀上的連續(xù)內(nèi)存),以及 System.Memory<T>
(用于訪問(wèn)托管堆上的連續(xù)內(nèi)存)。 所有集合(包括數(shù)組、Span<T> 和 Memory<T>)都遵循一種統(tǒng)一的迭代原則。 使用 System.Collections.Generic.IEnumerable<T>
接口。 這種統(tǒng)一的原則意味著任何集合類型都可以與 LINQ 查詢或其他算法一起使用。 你可以使用 IEnumerable<T>
編寫方法,這些算法適用于任何集合。
1、數(shù)組
數(shù)組是一種數(shù)據(jù)結(jié)構(gòu)*_,其中包含許多通過(guò)計(jì)算索引訪問(wèn)的變量。 數(shù)組中的變量(亦稱為數(shù)組的“元素”)均為同一種類型。 我們將這種類型稱為數(shù)組的“元素類型”。
數(shù)組類型是引用類型,聲明數(shù)組變量只是為引用數(shù)組實(shí)例預(yù)留空間。 實(shí)際的數(shù)組實(shí)例是在運(yùn)行時(shí)使用 new 運(yùn)算符動(dòng)態(tài)創(chuàng)建而成。 new 運(yùn)算指定了新數(shù)組實(shí)例的長(zhǎng)度,然后在此實(shí)例的生存期內(nèi)固定使用這個(gè)長(zhǎng)度。 數(shù)組元素的索引介于 0 到 Length - 1
之間。 new 運(yùn)算符自動(dòng)將數(shù)組元素初始化為其默認(rèn)值(例如,所有數(shù)值類型的默認(rèn)值為 0,所有引用類型的默認(rèn)值為 null)。
以下示例創(chuàng)建 int 元素?cái)?shù)組,初始化此數(shù)組,然后打印此數(shù)組的內(nèi)容。
int[] a = new int[10]; for (int i = 0; i < a.Length; i++) { a[i] = i * i; } for (int i = 0; i < a.Length; i++) { Console.WriteLine($"a[{i}] = {a[i]}"); }
此示例創(chuàng)建并在“一維數(shù)組”上進(jìn)行操作。 C# 還支持多維數(shù)組。 數(shù)組類型的維數(shù)(亦稱為數(shù)組類型的秩)是 1 與數(shù)組類型方括號(hào)內(nèi)的逗號(hào)數(shù)量相加的結(jié)果。 以下示例分別分配一維、二維、三維數(shù)組。
int[] a1 = new int[10]; int[,] a2 = new int[10, 5]; int[,,] a3 = new int[10, 5, 2];
a1 數(shù)組包含 10 個(gè)元素,a2 數(shù)組包含 50 個(gè)元素 (10 × 5),a3 數(shù)組包含 100 個(gè)元素 (10 × 5 × 2)。 數(shù)組的元素類型可以是任意類型(包括數(shù)組類型)。 包含數(shù)組類型元素的數(shù)組有時(shí)稱為“交錯(cuò)數(shù)組”,因?yàn)樵財(cái)?shù)組的長(zhǎng)度不必全都一樣。 以下示例分配由 int 數(shù)組構(gòu)成的數(shù)組:
int[][] a = new int[3][]; a[0] = new int[10]; a[1] = new int[5]; a[2] = new int[20];
第一行創(chuàng)建包含三個(gè)元素的數(shù)組,每個(gè)元素都是 int[] 類型,并且初始值均為 null
。 接下來(lái)的代碼行將這三個(gè)元素初始化為引用長(zhǎng)度不同的各個(gè)數(shù)組實(shí)例。
通過(guò) new
運(yùn)算符,可以使用“數(shù)組初始值設(shè)定項(xiàng)”(在分隔符 { 和 } 內(nèi)編寫的表達(dá)式列表)指定數(shù)組元素的初始值。 以下示例分配 int[],并將其初始化為包含三個(gè)元素。
int[] a = new int[] { 1, 2, 3 };
可從 { 和 } 內(nèi)的表達(dá)式數(shù)量推斷出數(shù)組的長(zhǎng)度。 數(shù)組初始化可以進(jìn)一步縮短,這樣就不用重新聲明數(shù)組類型了。
int[] a = { 1, 2, 3 };
以上兩個(gè)示例等同于以下代碼:
int[] t = new int[3]; t[0] = 1; t[1] = 2; t[2] = 3; int[] a = t;
foreach 語(yǔ)句可用于枚舉任何集合的元素。 以下代碼從前一個(gè)示例中枚舉數(shù)組:
foreach (int item in a) { Console.WriteLine(item); }
foreach
語(yǔ)句使用 IEnumerable<T>
接口,因此適用于任何集合。
二、字符串內(nèi)插
C# 字符串內(nèi)插使你能夠通過(guò)定義表達(dá)式(其結(jié)果放置在格式字符串中)來(lái)設(shè)置字符串格式。 例如,以下示例從一組天氣數(shù)據(jù)顯示給定日期的溫度:
Console.WriteLine($"The low and high temperature on {weatherData.Date:MM-DD-YYYY}"); Console.WriteLine($" was {weatherData.LowTemp} and {weatherData.HighTemp}."); // Output (similar to): // The low and high temperature on 08-11-2020 // was 5 and 30.
內(nèi)插字符串通過(guò) $ 標(biāo)記來(lái)聲明。 字符串插內(nèi)插計(jì)算 { 和 } 之間的表達(dá)式,然后將結(jié)果轉(zhuǎn)換為 string,并將括號(hào)內(nèi)的文本替換為表達(dá)式的字符串結(jié)果。 第一個(gè)表達(dá)式 ({weatherData.Date:MM-DD-YYYY})
中的 : 指定格式字符串。 在前一個(gè)示例中,這指定日期應(yīng)以“MM-DD-YYYY
”格式顯示。
三、模式匹配
C# 語(yǔ)言提供模式匹配表達(dá)式來(lái)查詢對(duì)象的狀態(tài)并基于該狀態(tài)執(zhí)行代碼。 你可以檢查屬性和字段的類型和值,以確定要執(zhí)行的操作。 switch
表達(dá)式是模式匹配的主要表達(dá)式。
四、委托和 Lambda 表達(dá)式
委托類型表示對(duì)具有特定參數(shù)列表和返回類型的方法的引用。 通過(guò)委托,可以將方法視為可分配給變量并可作為參數(shù)傳遞的實(shí)體。 委托還類似于其他一些語(yǔ)言中存在的“函數(shù)指針”概念。 與函數(shù)指針不同,委托是面向?qū)ο笄翌愋桶踩摹?/p>
下面的示例聲明并使用 Function 委托類型:
delegate double Function(double x); class Multiplier { double _factor; public Multiplier(double factor) => _factor = factor; public double Multiply(double x) => x * _factor; } class DelegateExample { static double[] Apply(double[] a, Function f) { var result = new double[a.Length]; for (int i = 0; i < a.Length; i++) result[i] = f(a[i]); return result; } public static void Main() { double[] a = { 0.0, 0.5, 1.0 }; double[] squares = Apply(a, (x) => x * x); double[] sines = Apply(a, Math.Sin); Multiplier m = new(2.0); double[] doubles = Apply(a, m.Multiply); } }
Function
委托類型實(shí)例可以引用需要使用 double 自變量并返回 double 值的方法。 Apply 方法將給定的 Function
應(yīng)用于 double[] 的元素,從而返回包含結(jié)果的 double[]。 在 Main 方法中,Apply 用于向 double[] 應(yīng)用三個(gè)不同的函數(shù)。
委托可以引用靜態(tài)方法(如上面示例中的 Square 或 Math.Sin)或?qū)嵗椒ǎㄈ缟厦媸纠械?m.Multiply)。 引用實(shí)例方法的委托還會(huì)引用特定對(duì)象,通過(guò)委托調(diào)用實(shí)例方法時(shí),該對(duì)象會(huì)變成調(diào)用中的 this。
還可以使用匿名函數(shù)或 Lambda
表達(dá)式創(chuàng)建委托,這些函數(shù)是在聲明時(shí)創(chuàng)建的“內(nèi)聯(lián)方法”。 匿名函數(shù)可以查看周圍方法的局部變量。
?以下示例不創(chuàng)建類:
double[] doubles = Apply(a, (double x) => x * 2.0);
委托不知道或不在意其所引用的方法的類。 引用的方法必須具有與委托相同的參數(shù)和返回類型。
五、async/await
C# 支持含兩個(gè)關(guān)鍵字的異步程序:async 和 await。 將 async 修飾符添加到方法聲明中,以聲明這是異步方法。 await 運(yùn)算符通知編譯器異步等待結(jié)果完成。 控件返回給調(diào)用方,該方法返回一個(gè)管理異步工作狀態(tài)的結(jié)構(gòu)。 結(jié)構(gòu)通常是 System.Threading.Tasks.Task<TResult>,但可以是任何支持 awaiter 模式的類型。 這些功能使你能夠編寫這樣的代碼:以其同步對(duì)應(yīng)項(xiàng)的形式讀取,但以異步方式執(zhí)行。 例如,以下代碼會(huì)下載 Microsoft Docs 的主頁(yè):
public async Task<int> RetrieveDocsHomePage() { var client = new HttpClient(); byte[] content = await client.GetByteArrayAsync("https://docs.microsoft.com/"); Console.WriteLine($"{nameof(RetrieveDocsHomePage)}: Finished downloading."); return content.Length; }
這一小型示例顯示了異步編程的主要功能:
- 方法聲明包含
async
修飾符。 - 方法 await 的主體是
GetByteArrayAsync
方法的返回。 - return 語(yǔ)句中指定的類型與方法的
Task<T>
聲明中的類型參數(shù)匹配。 (返回 Task 的方法將使用不帶任何參數(shù)的 return 語(yǔ)句)。
六、屬性
C# 程序中的類型、成員和其他實(shí)體支持使用修飾符來(lái)控制其行為的某些方面。 例如,方法的可訪問(wèn)性是由 public
、protected
、internal
和 private
修飾符控制。 C# 整合了這種能力,以便可以將用戶定義類型的聲明性信息附加到程序?qū)嶓w,并在運(yùn)行時(shí)檢索此類信息。 程序通過(guò)定義和使用特性來(lái)指定此聲明性信息。
以下示例聲明了 HelpAttribute
特性,可將其附加到程序?qū)嶓w,以提供指向關(guān)聯(lián)文檔的鏈接。
public class HelpAttribute : Attribute { string _url; string _topic; public HelpAttribute(string url) => _url = url; public string Url => _url; public string Topic { get => _topic; set => _topic = value; } }
所有特性類都派生自 .NET
庫(kù)提供的 Attribute
基類。 特性的應(yīng)用方式為,在相關(guān)聲明前的方括號(hào)內(nèi)指定特性的名稱以及任意自變量。 如果特性的名稱以 Attribute
結(jié)尾,那么可以在引用特性時(shí)省略這部分名稱。 例如,可按如下方法使用 HelpAttribute
。
[Help("https://docs.microsoft.com/dotnet/csharp/tour-of-csharp/features")] public class Widget { [Help("https://docs.microsoft.com/dotnet/csharp/tour-of-csharp/features", Topic = "Display")] public void Display(string text) { } }
此示例將 HelpAttribute
附加到 Widget
類。 還向此類中的 Display 方法附加了另一個(gè) HelpAttribute
。 特性類的公共構(gòu)造函數(shù)控制了將特性附加到程序?qū)嶓w時(shí)必須提供的信息。 可以通過(guò)引用特性類的公共讀寫屬性(如上面示例對(duì) Topic 屬性的引用),提供其他信息。
可以在運(yùn)行時(shí)使用反射來(lái)讀取和操縱特性定義的元數(shù)據(jù)。 如果使用這種方法請(qǐng)求獲取特定特性,便會(huì)調(diào)用特性類的構(gòu)造函數(shù)(在程序源中提供信息)。 返回生成的特性實(shí)例。 如果是通過(guò)屬性提供其他信息,那么在特性實(shí)例返回前,這些屬性會(huì)設(shè)置為給定值。
下面的代碼示例展示了如何獲取與 Widget
類及其 Display
方法相關(guān)聯(lián)的 HelpAttribute
實(shí)例。
Type widgetType = typeof(Widget); object[] widgetClassAttributes = widgetType.GetCustomAttributes(typeof(HelpAttribute), false); if (widgetClassAttributes.Length > 0) { HelpAttribute attr = (HelpAttribute)widgetClassAttributes[0]; Console.WriteLine($"Widget class help URL : {attr.Url} - Related topic : {attr.Topic}"); } System.Reflection.MethodInfo displayMethod = widgetType.GetMethod(nameof(Widget.Display)); object[] displayMethodAttributes = displayMethod.GetCustomAttributes(typeof(HelpAttribute), false); if (displayMethodAttributes.Length > 0) { HelpAttribute attr = (HelpAttribute)displayMethodAttributes[0]; Console.WriteLine($"Display method help URL : {attr.Url} - Related topic : {attr.Topic}"); }
到此這篇關(guān)于C#語(yǔ)言主要語(yǔ)言區(qū)域的文章就介紹到這了,更多相關(guān)主要語(yǔ)言區(qū)域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用StopWatch獲取程序毫秒級(jí)執(zhí)行時(shí)間的方法
這篇文章主要介紹了C#使用StopWatch獲取程序毫秒級(jí)執(zhí)行時(shí)間的方法,涉及C#操作時(shí)間的相關(guān)技巧,需要的朋友可以參考下2015-04-04淺談C#中HttpWebRequest與HttpWebResponse的使用方法
本篇文章主要介紹了淺談C#中HttpWebRequest與HttpWebResponse的使用方法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01WPF+SkiaSharp實(shí)現(xiàn)自繪投籃小游戲
這篇文章主要介紹了如何利用WPF+SkiaSharp實(shí)現(xiàn)自繪投籃小游戲。此案例主要是針對(duì)光線投影法碰撞檢測(cè)功能的示例,順便做成了一個(gè)小游戲,很簡(jiǎn)單,但是,效果卻很不錯(cuò),感興趣的可以動(dòng)手嘗試一下2022-08-08automation服務(wù)器不能創(chuàng)建對(duì)象 解決方法
本文主要介紹如何解決“automation服務(wù)器不能創(chuàng)建對(duì)象”錯(cuò)誤,從而解決Visual Studio.Net不能正常使用的問(wèn)題,需要的朋友可以參考下。2016-06-06C# 表達(dá)式目錄樹(shù)Expression的實(shí)現(xiàn)
本文主要介紹了C# 表達(dá)式目錄樹(shù)Expression的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼
c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼,需要的朋友可以參考下2012-10-10詳細(xì)聊聊C#的并發(fā)機(jī)制優(yōu)秀在哪
并發(fā)其實(shí)是一個(gè)很泛的概念,字面意思就是"同時(shí)做多件事",不過(guò)方式有所不同,下面這篇文章主要給大家介紹了關(guān)于C#并發(fā)機(jī)制的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02