C# 基础——C#特性
.NET C# Web開發(fā)學(xué)習(xí)之路——C#特性
C#歷史辦版本及特性
| C# 1.0 | 2002.1 | .NET Framework 1.0 | Visual Studio .NET 2002 |
| C# 1.1\1.2 | 2003.4 | .NET Framework 1.1 | Visual Studio .NET 2003 |
| C# 2.0 | 2005.11 | .NET Framework 2.0 | Visual Studio 2005 |
| C# 3.0 | 2007.11 | .NET Framework2.0\3.0\3.5 | Visual Studio 2008 |
| C# 4.0 | 2010.4 | .NET Framework 4.0 | Visual Studio 2010 |
| C# 5.0 | 2012.8 | .NET Framework 4.5 | Visual Studio 2012/2013 |
| C# 6.0 | 2015.7 | .NET Framework 4.6 | Visual Studio 2015 |
| C# 7.0 | 2017.3 | .NET Framework 4.6.2 | Visual Studio 2017 |
| C# 7.1 | 2017.6 | .NET Framework 4.7 | Visual Studio 2017 v15.3 預(yù)覽版 |
| C# 8.0 | 2019.4 | .NET Framework 4.8 | Visual Studio 2019 v16.0 |
Visual Studio、.NET Framework、VC++、C#各個版本的對應(yīng)關(guān)系
| Visual Studio版本 | .NET Framework版本 | 內(nèi)部版本 | VC++版本 | C#版本 |
| Visual Studio 2002 | .NET Framework1.0 | 7.0 | VC++2002 | VC#1.0 |
| Visual Studio 2003 | .NET Framework1.1 | 7.1 | VC++2003 | VC#1.1 |
| Visual Studio 2005 | .NET Framework2.0 | 8.0 | VC++2005 | VC#2.0 |
| Visual Studio 2008 | .NET Framework3.5 | 9.0 | VC++2008 | VC#3.0 |
| Visual Studio 2010 | .NET Framework4.0 | 10.0 | VC++2010 | VC#4.0 |
| Visual Studio 2012 | .NET Framework4.5 | 11.0 | VC++2012 | VC#5.0 |
| Visual Studio 2013 | .NET Framework4.5.1 | 12.0 | VC++2013 | VC#5.0 |
| Visual Studio 2015 | .NET Framework4.6 | 14.0 | VC++2015 | VC#6.0 |
| Visual Studio 2017 | .NET Framework4.6.2-4.7 | 15.0 | VC++2017 | VC#7.0 |
| Visual Studio 2019 | .NET Framework4.8 | 16.0 | VC++2019 | VC#8.0 |
總結(jié):1.Visual Studio 版本號是第一個正式版的發(fā)布年份,VC++版本號跟Visual Studio 一一對應(yīng)
? ? ? ? ? ?2.C#版本4.0前跟.net FrameWork一一對應(yīng),4.0之后,C#的版本號跟Visual Studio 的次版本號 一一對應(yīng)
?
C# 1.0 特性
- Classes:面向?qū)ο筇匦?#xff0c;支持類類型
- Structs:結(jié)構(gòu)
- Interfaces:接口
- Events:事件
- Properties:屬性,類的成員,提供訪問字段的靈活方法
- Delegates:委托,一種引用類型,表示對具有特定參數(shù)列表和返回類型的方法的引用
- Expressions,Statements,Operators:表達(dá)式、語句、操作符
- Attributes:特性,為程序代碼添加元數(shù)據(jù)或聲明性信息,運行時,通過反射可以訪問特性信息
- Literals:字面值(或理解為常量值),區(qū)別常量,常量是和變量相對的?
C# 1.1?特性
- APM:基于IAsyncResult接口實現(xiàn)了BeginXXX EndXXX的也成為AsyncResult異步編程
?
C# 2特性 (VS 2005)
- Generics:泛型
- Partial types:分部類型,可以將類、結(jié)構(gòu)、接口等類型定義拆分到多個文件中
- Anonymous methods:匿名方法
- Iterators:迭代器
- Nullable types:可以為Null的類型,該類可以是其它值或者null
- Getter/setter separate accessibility:屬性訪問控制
- Method group conversions (delegates):方法組轉(zhuǎn)換,可以將聲明委托代表一組方法,隱式調(diào)用
- Co- and Contra-variance for delegates and interfaces:委托、接口的協(xié)變和逆變
- Static classes:靜態(tài)類
- Delegate inference:委托推斷,允許將方法名直接賦給委托變量
- EPM:EPM基于APM基于委托。標(biāo)志是XXXAsync的方法和對應(yīng)的XXXCompleted XXXChanged?XXX
C# 3特性 (VS 2008)
- Implicitly typed local variables:
- Object and collection initializers:對象和集合初始化器
- Auto-Implemented properties:自動屬性,自動生成屬性方法,聲明更簡潔
- Anonymous types:匿名類型
- Extension methods:擴展方法
- Query expressions:查詢表達(dá)式
- Lambda expression:Lambda表達(dá)式
- Expression trees:表達(dá)式樹,以樹形數(shù)據(jù)結(jié)構(gòu)表示代碼,是一種新數(shù)據(jù)類型
- Partial methods:部分方法?
C# 4特性 (VS 2010)
- Dynamic binding:動態(tài)綁定
- Named and optional arguments:命名參數(shù)和可選參數(shù)
- Generic co- and contravariance:泛型的協(xié)變和逆變
- Embedded interop types (“NoPIA”):開啟嵌入類型信息,增加引用COM組件程序的中立性?
C# 5特性 (VS 2012)
- Asynchronous methods:異步方法【異步和等待(async和await)】
- Caller info attributes:調(diào)用方信息特性,調(diào)用時訪問調(diào)用者的信息
C# 6特征 (VS 2015)
- Compiler-as-a-service (Roslyn)
- Import of static type members into namespace:支持僅導(dǎo)入類中的靜態(tài)成員
- Exception filters:異常過濾器
- Await in catch/finally blocks:支持在catch/finally語句塊使用await語句
- Auto property initializers:自動屬性初始化
- Default values for getter-only properties:設(shè)置只讀屬性的默認(rèn)值
- Expression-bodied members:支持以表達(dá)式為主體的成員方法和只讀屬性
- Null propagator (null-conditional operator, succinct null checking):Null條件操作符
- String interpolation:字符串插值,產(chǎn)生特定格式字符串的新方法
- nameof operator:nameof操作符,返回方法、屬性、變量的名稱
- Dictionary initializer:字典初始化?
C# 7 特征 (Visual Studio 2017)
- Out variables:out變量直接聲明,例如可以out in parameter
- Pattern matching:模式匹配,根據(jù)對象類型或者其它屬性實現(xiàn)方法派發(fā)
- Tuples:元組
- Deconstruction:元組解析
- Discards:沒有命名的變量,只是占位,后面代碼不需要使用其值
- Local Functions:局部函數(shù)
- Binary Literals:二進制字面量
- Digit Separators:數(shù)字分隔符
- Ref returns and locals:引用返回值和局部變量
- Generalized async return types:async中使用泛型返回類型
- More expression-bodied members:允許構(gòu)造器、解析器、屬性可以使用表達(dá)式作為body
- Throw expressions:Throw可以在表達(dá)式中使用?
C# 7.1 特征 (Visual Studio 2017 version 15.3)
- Async main:在main方法用async方式
- Default expressions:引入新的字面值default
- Reference assemblies:
- Inferred tuple element names:
- Pattern-matching with generics:
-
C# 8.0 特性
- Classes
下面是 C# 8.0 中最重要的新特性的概述。還有一些較小的改進正在進行中,這些改進將在未來幾個月逐漸顯現(xiàn)出來。
Nullable reference types 可空引用類型
此特性的目的是幫助處理無處不在的空引用異常,這種異常已經(jīng)困擾了半個世紀(jì)的面向?qū)ο缶幊獭?/p>
這個特性阻止您將 null 放入普通引用類型中(如字符串),從而使這些類型不可為 null!不過它是溫和的提示警告,而不是錯誤。所以,它會讓現(xiàn)有代碼出現(xiàn)新的警告,因此您必須有選擇的使用該功能 (您可以在項目、文件甚至行級別執(zhí)行此操作)。
string s = null; // Warning: Assignment of null to non-nullable reference type如果您確實想要 null 怎么辦?可以使用一個可空引用類型,例如 string? 這樣:
string? s = null; // Ok當(dāng)您嘗試使用可空引用類型時,你首先需要檢查是否為空。編譯器會分析代碼流,以查看 null 值是否可以將其用于當(dāng)前位置:
void M(string? s) {Console.WriteLine(s.Length); // Warning: Possible null reference exceptionif (s != null){Console.WriteLine(s.Length); // Ok: You won't get here if s is null} }這個特性的要點是,C# 允許您表達(dá)“可空的意圖”,并且在您不遵守它時候發(fā)出警告。
Async streams 異步流
C# 5.0 的 async/await 特性使您可以用非常簡單的代碼消費(或生產(chǎn))異步結(jié)果, 而無需回調(diào):
async Task<int> GetBigResultAsync() {var result = await GetResultAsync();if (result > 20) return result; else return -1; }如果您想要消費(或生產(chǎn))連續(xù)的結(jié)果流(例如您可能從物聯(lián)網(wǎng)設(shè)備或云服務(wù)獲得),則沒有那么有用。 異步流就是為此而存在的。
如果您想要消費(或生產(chǎn))連續(xù)的結(jié)果流(例如您可能從物聯(lián)網(wǎng)設(shè)備或云服務(wù)獲得),則沒有那么有用。 異步流就是為此而存在的。
我們現(xiàn)在介紹一下您所期望的 IAsyncEnumerable<T>,即 IEnumerable<T>?的異步版本。允許您 await foreach 以消費它們的元素,并 yield return 以生產(chǎn)元素。
async IAsyncEnumerable<int> GetBigResultsAsync() {await foreach (var result in GetResultsAsync()){if (result > 20) yield return result; } }Ranges and indices 范圍和索引
我們正在添加一個類型 Index,可用于索引。您可以創(chuàng)建一個整型來表示從頭開始的索引,或者一個 ^ 前綴的從結(jié)尾表示的索引:
Index i1 = 3; // number 3 from beginning Index i2 = ^4; // number 4 from end int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"我們還引入了一個 Range 類型,它由兩個 Index 組成,一個用于開始,一個用于結(jié)束,并且可以用 x..y 這樣的范圍表達(dá)式來編寫。然后,您可以使用 Range 進行索引來生成切片:
var slice = a[i1..i2]; // { 3, 4, 5 }Default implementations of interface members 接口成員的默認(rèn)實現(xiàn)
現(xiàn)在,一旦你發(fā)布了一個接口,游戲就結(jié)束了:你不能在不破壞它的所有現(xiàn)有實現(xiàn)的情況下向它添加成員。
在 C# 8.0 中,我們允許您為接口成員提供一個默認(rèn)實現(xiàn)。因此,如果某人沒有實現(xiàn)該成員(可能因為他們編寫代碼時還沒有該成員),他們將只得到默認(rèn)的實現(xiàn)。
interface ILogger {void Log(LogLevel level, string message);void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); // New overload }class ConsoleLogger : ILogger {public void Log(LogLevel level, string message) { ... }// Log(Exception) gets default implementation }ConsoleLogger 類不必實現(xiàn) ILogger 中 Log(Exception) 重載函數(shù),因為它已經(jīng)定義了默認(rèn)實現(xiàn)。現(xiàn)在只要提供了一個默認(rèn)實現(xiàn),您就可以添加新的成員到已經(jīng)存在的公開接口中了。
Recursive patterns 遞歸的模式匹配
在模式匹配中,現(xiàn)在允許模式中包含其他模式。
IEnumerable<string> GetEnrollees() {foreach (var p in People){if (p is Student { Graduated: false, Name: string name }) yield return name;} }這個模式?Student { Graduated: false, Name: string name }?會檢查 Person 是否是 Student,然后將常量模式 false 應(yīng)用于 Graduated 屬性以查看它們是否已畢業(yè),并將模式字符串 name 添加到其 Name 屬性中,得到他們的名字(如果非空)。因此,如果 p 是 Student,沒有畢業(yè)并且具有非空的名字,則返回該名字。
Switch expressions Switch 表達(dá)式
帶有模式的 switch 語句在 C# 7.0 中非常強大,但編寫起來很麻煩。switch 表達(dá)式是一個“輕量級”版本,其中所有情況都是表達(dá)式:
var area = figure switch {Line _ => 0,Rectangle r => r.Width * r.Height,Circle c => c.Radius * 2.0 * Math.PI,_ => throw new UnknownFigureException(figure) };Target-typed new-expressions 已知目標(biāo)類型的新表達(dá)式
在許多情況下,當(dāng)您創(chuàng)建新對象時,類型已經(jīng)可以從上下文中知道。在這些情況下,可以省略類型:
Point[] ps = { new (1, 4), new (3,-2), new (9, 5) }; // all Points該功能的實現(xiàn)由社區(qū)成員提供,謝謝!
平臺依賴性
大多數(shù) C# 8.0 語言特性都可以在任何版本的 .NET 上運行。但是,其中一些具有平臺依賴性。
Async streams, Index 和 Range 都依賴于 .NET Standard 2.1 的新類型。正如 Immo 在他的文章《公布.NET Standard 2.1》所說的那樣,.NET Core 3.0 、Xamarin 、Unity 和 Mono 都將實現(xiàn) .NET Standard 2.1,但 .NET Framework 4.8 不會。這意味著當(dāng)您將 C# 8.0 指向到 .NET Framework 4.8 時,使用這些功能所需的類型將不可用。
與往常一樣,C# 編譯器對它所依賴的類型非常寬容。如果它能找到具有正確的名字和形態(tài)的類型,則很樂意將它們作為目標(biāo)。
默認(rèn)接口實現(xiàn)依賴于新的增強運行時,我們也不會在 .NET Runtime 4.8 中實現(xiàn)這些。因此,此特性不適用于 .NET Framework 4.8 和舊版本的 .NET。
十余年間,為了保持運行時的穩(wěn)定,我們無法在其中實現(xiàn)新的語言特性。隨著現(xiàn)代化運行時的并行性和開源性,我們覺得可以負(fù)責(zé)任地去重新開發(fā)它們,并在考慮到這一點時進行語言設(shè)計。 Scott 在其?.NET Core 3.0 和 .NET Framework 4.8 更新中解釋說,.NET Framework 將來會看到較少的創(chuàng)新,而是關(guān)注穩(wěn)定性和可靠性。考慮到這一點,我們認(rèn)為,直接忽略某些語言特性會好一些。
想要了解更多?
C# 語言的設(shè)計過程是開源的,在這個repo中。如果您不經(jīng)常跟進,可能會有點混亂和力不從心。語言設(shè)計的核心是語言設(shè)計會議,記錄在?C# 語言設(shè)計日記。
大約一年前,我寫了一篇介紹C#中的可空引用類型的文章。您仍然可以閱讀它并得到一些信息。。
您還可以觀看視頻,例如 Microsoft Build 2018 大會上的?C# 未來,或者 .NET Conf 2018 大會上的即將到來的 C#,它展示了其中一些特性。
Kathleen 有一篇很好的帖子來闡述了?.Net Core 3.0 中的 Visual Basic?的計劃。
當(dāng)我們開始將這些功能作為 Visual Studio 2019 預(yù)覽版的一部分發(fā)布時,我們還將發(fā)布有關(guān)各個功能的更多詳細(xì)信息。
就個人而言,我迫不及待地要把它們交到你們所有人手中!
Happy hacking,
Mads Torgersen, Design Lead for C#
總結(jié)
以上是生活随笔為你收集整理的C# 基础——C#特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB的几种打印方法
- 下一篇: 疯狂印钞后,美联储资产负债突破7.1万亿