" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#類型系統(tǒng)從7.0到14.0的發(fā)展歷程和版本特性

 更新時間:2025年10月03日 11:31:59   作者:AI·NET極客圈  
C#類型系統(tǒng)從7.0到14.0的演進顯著提升了性能、類型安全性和開發(fā)效率,版本迭代中,值類型優(yōu)化(如Span、記錄結構)顯著降低GC壓力,而可空引用和必需成員等特性增強了編譯時驗證,C# 14的field關鍵字和隱式span轉換進一步減少了高性能場景的樣板代碼

C# 是一種由 Microsoft 開發(fā)的面向對象的編程語言,它最初于 2000 年發(fā)布,并在隨后的版本中不斷更新和改進。自C# 7.0以來,C#語言在類型系統(tǒng)方面引入了眾多新數據類型、類型構造和語言特性,以提升性能、類型安全性和開發(fā)效率。本文全面整理了從C# 7.0到C# 14.0(截至2025年4月,C# 14.0為預覽版)類型系統(tǒng)的新增內容,包括值元組、Span<T>ReadOnlySpan<T>、Memory<T>、ReadOnlyMemory<T>、可空引用類型、記錄、本機大小整數、記錄結構、內聯數組,以及其他增強(如只讀結構、泛型數學支持)。

版本概覽

以下是C# 7.0至C# 14.0中類型系統(tǒng)新增或增強的主要內容:

C# 版本新增/增強內容發(fā)布年份描述
7.0值元組(Value Tuples)2017輕量級數據結構,支持多值返回和解構
7.2Span, ReadOnlySpan, 只讀結構, 引用結構2017高性能內存操作和不可變/棧分配結構體
8.0可空引用類型, Memory, ReadOnlyMemory2019空值安全性和托管內存塊
9.0記錄, 本機大小整數, 初始化器專用類型2020值語義引用類型、本機整數和不可變屬性
10.0記錄結構, 全局 using 指令2021值類型記錄和簡化類型引用
11.0必需成員, 泛型數學支持, 文件局部類型2022強制初始化、泛型運算和類型作用域限制
12.0內聯數組2023固定大小數組結構,優(yōu)化性能
13.0參數集合擴展, 引用結構接口支持, 部分屬性2024擴展params、ref struct接口和部分屬性定義
14.0field 關鍵字, 隱式 span 轉換, nameof 增強, lambda 參數修飾符, partial 成員擴展, 空條件賦值2025增強屬性訪問、span 使用、泛型處理、lambda 表達、partial 類型和空值處理

以下按版本逐一詳述,每節(jié)包含特性表格、代碼示例和分析。

C# 7.0:值元組

特性表格

類型/構造描述主要用途注意事項
值元組 (Value Tuples)輕量級值類型,支持多值返回、命名元素和解構方法返回多個值、臨時數據分組值類型,棧分配;.NET Framework需引用System.ValueTuple包

概述

值元組基于System.ValueTuple,允許方法返回多個值,支持命名元素和解構,簡化數據傳遞。

語法

聲明:(type1, type2, ...) tupleName = (value1, value2, ...);

命名元素:(type1 name1, type2 name2, ...) tupleName = (value1, value2, ...);

解構:var (var1, var2, ...) = tupleName;

示例代碼

public(intid,stringname)GetPerson(){return(1,"Alice");}varperson=GetPerson();Console.WriteLine($"ID:{person.id},Name:{person.name}");//解構var(id,name)=GetPerson();Console.WriteLine($"ID:{id},Name:{name}");

適用場景

方法返回多個相關值。

臨時數據分組,無需定義類或結構。

解構賦值,簡化代碼。

注意事項

值類型,適合輕量數據。

.NET Framework項目需引用System.ValueTuple NuGet包。

C# 7.2:Span, ReadOnlySpan, 只讀結構, 引用結構

特性表格

類型/構造描述主要用途注意事項
Span表示連續(xù)內存塊的引用,支持讀寫高性能數組/內存操作ref struct,棧分配,生命周期限制
ReadOnlySpan只讀連續(xù)內存塊引用高性能只讀操作同上,需確保內存邊界安全
只讀結構 (readonly struct)不可變結構體,優(yōu)化性能不可變數據結構所有實例字段必須只讀
引用結構 (ref struct)棧分配結構體高性能內存管理不可boxing或作為接口實現

概述

Span<T>ReadOnlySpan<T>是高性能值類型,表示連續(xù)內存塊引用,適合數組和本機內存操作。readonly struct確保結構體不可變,ref struct限制為棧分配,支持Span<T>等類型。

語法

Span: Span<T> span = collection.AsSpan();

ReadOnlySpan: ReadOnlySpan<T> readOnlySpan = collection.AsSpan();

只讀結構: readonly struct StructName { ... }

引用結構: ref struct StructName { ... }

示例代碼

//Span<T>和ReadOnlySpan<T>int[]numbers=[1,2,3,4,5];Span<int>span =numbers.AsSpan(1,3);span[0]=10;Console.WriteLine(string.Join(",",span.ToArray()));//10,3,4ReadOnlySpan<char>text="Hello".AsSpan();Console.WriteLine(text.Slice(0,2).ToString());//He//只讀結構readonlystructPoint{publicintX{get;init;}publicintY{get;init;}}Pointpoint=new(){X=1,Y=2};Console.WriteLine($"({point.X},{point.Y})");//(1,2)//引用結構refstructBuffer{publicSpan<int>Data;publicBuffer(Span<int>data)=>Data=data;}Bufferbuffer=new(numbers.AsSpan());buffer.Data[0]=10;Console.WriteLine(numbers[0]);//10

適用場景

高性能字符串解析、緩沖區(qū)處理。

不可變數據結構(只讀結構)。

避免堆分配(引用結構)。

注意事項

Span<T>ReadOnlySpan<T>不可用于異步方法。

ref struct限制嚴格,需管理生命周期。

C# 8.0:可空引用類型, Memory, ReadOnlyMemory

特性表格

類型/構造描述主要用途注意事項
可空引用類型引用類型可標記為可空,默認非null增強空值安全性需啟用可空上下文,處理編譯器警告
Memory托管內存塊,支持讀寫異步和高性能內存操作適合異步場景,需管理生命周期
ReadOnlyMemory只讀托管內存塊只讀異步內存操作同上

概述

可空引用類型通過?后綴指定引用類型是否可為null,減少空引用異常。Memory<T>ReadOnlyMemory<T>表示托管內存塊,支持異步場景。

語法

可空引用類型: string? nullable; string nonNullable;

Memory: Memory<T> memory = collection.AsMemory();

ReadOnlyMemory: ReadOnlyMemory<T> readOnlyMemory = collection.AsMemory();

示例代碼

//可空引用類型#nullableenablestringnonNullable="Hello";string?nullable=null;if(nullable!=null){Console.WriteLine(nullable.Length);}//Memory<T>和ReadOnlyMemory<T>int[]numbers=[1,2,3,4,5];Memory<int>memory=numbers.AsMemory(1,3);Span<int>span =memory.Span;span[0]=10;Console.WriteLine(string.Join(",",memory.ToArray()));//10,3,4ReadOnlyMemory<char>text="Hello".AsMemory();Console.WriteLine(text.Slice(0,2).Span.ToString());//He

適用場景

增強空值安全性(可空引用類型)。

異步內存操作(Memory)。

只讀數據傳遞(ReadOnlyMemory)。

注意事項

可空引用類型需顯式啟用。

Memory生命周期需管理。

C# 9.0:記錄, 本機大小整數, 初始化器專用類型

特性表格

類型/構造描述主要用途注意事項
記錄 (Records)具有值語義的引用類型,默認不可變數據建模,值相等性默認不可變,可添加可變行為
本機大小整數 (nint, nuint)本機大小整數,映射IntPtr/UIntPtr本機代碼互操作平臺依賴,需考慮兼容性
初始化器專用類型 (init-only setters)初始化后不可變屬性不可變數據模型僅初始化時可賦值

概述

記錄是具有值語義的引用類型,自動實現相等性。nintnuint支持本機大小整數。init修飾符增強屬性不可變性。

語法

記錄: public record ClassName(type1 Property1, ...);

本機大小整數: nint nativeInt; nuint nativeUInt;

init-only: public type Property { get; init; }

示例代碼

//記錄publicrecordPerson(stringFirstName,stringLastName);varperson1=newPerson("Alice","Smith");varperson2=newPerson("Alice","Smith");Console.WriteLine(person1==person2);//Truevarperson3=person1with{LastName="Johnson"};Console.WriteLine(person3);//Person{FirstName=Alice,LastName=Johnson}//本機大小整數nintnativeInt=42;nuintnativeUInt=42u;Console.WriteLine($"Nativeint:{nativeInt},Nativeuint:{nativeUInt}");//初始化器專用類型publicclassStudent{publicstringName{get;init;}}varstudent=newStudent{Name="Alice"};Console.WriteLine(student.Name);//Alice

適用場景

數據傳輸對象(記錄)。

本機代碼互操作(nint, nuint)。

不可變數據模型(init-only)。

注意事項

記錄支持繼承,需保持值語義。

本機大小整數平臺依賴。

C# 10.0:記錄結構, 全局 using 指令

特性表格

類型/構造描述主要用途注意事項
記錄結構 (Record Structs)值類型的記錄,結合值語義和性能小型數據結構值類型,復制成本需考慮
全局 using 指令全局導入命名空間簡化類型引用需平衡代碼可讀性

概述

記錄結構將記錄特性擴展到值類型,結合值語義和性能。全局using簡化類型引用。

語法

記錄結構: public record struct StructName(type1 Property1, ...);

全局 using: global using System;

示例代碼

//記錄結構publicrecordstructPoint(intX,intY);varpoint1=newPoint(1,2);varpoint2=newPoint(1,2);Console.WriteLine(point1==point2);//Truevarpoint3=point1with{X=3};Console.WriteLine(point3);//Point{X=3,Y=2}//全局using(假設已在文件頂部)Console.WriteLine("Hello,World!");//無需顯式usingSystem

適用場景

值類型數據建模(記錄結構)。

大型項目命名空間管理(全局 using)。

注意事項

記錄結構復制成本需關注。

全局 using 需謹慎使用。

C# 11.0:必需成員, 泛型數學支持, 文件局部類型

特性表格

類型/構造描述主要用途注意事項
必需成員 (required members)強制成員初始化確保關鍵字段初始化需配合初始化器或構造函數
泛型數學支持靜態(tài)抽象接口成員支持泛型運算泛型算法庫需運行時支持(.NET 7+)
文件局部類型 (file modifier)限制類型作用域至文件隔離輔助類型僅限文件作用域

概述

required修飾符強制成員初始化。泛型數學支持通過接口實現數值運算。file修飾符限制類型作用域。

語法

必需成員: public required type Property { get; set; }

泛型數學: interface INumber<T> { static abstract T operator +(T, T); }

文件局部類型: file class ClassName { ... }

示例代碼

//必需成員publicclassPerson{publicrequiredstringName{get;set;}}varperson=newPerson{Name="Alice"};Console.WriteLine(person.Name);//Alice//泛型數學支持publicinterfaceINumber<T>whereT:INumber<T>{staticabstractTAdd(Tleft,Tright);}publicreadonlystructMyNumber:INumber<MyNumber>{publicintValue{get;init;}publicMyNumber(intvalue)=>Value=value;publicstaticMyNumberAdd(MyNumberleft,MyNumberright)=>new(left.Value+right.Value);}MyNumbera=new(1);MyNumberb=new(2);varresult=MyNumber.Add(a,b);Console.WriteLine(result.Value);//3//文件局部類型fileclassHelper{publicstaticvoidLog(stringmessage)=>Console.WriteLine(message);}Helper.Log("Test");

適用場景

API 設計(必需成員)。

泛型數值計算(泛型數學)。

代碼生成(文件局部類型)。

注意事項

必需成員需明確初始化。

泛型數學需運行時支持。

C# 12.0:內聯數組

特性表格

類型/構造描述主要用途注意事項
內聯數組 (Inline Arrays)固定大小數組結構,棧分配高性能固定大小數組固定大小,僅限結構體內

概述

內聯數組通過[InlineArray]特性定義固定大小數組結構,優(yōu)化性能。

語法

[InlineArray(length)]publicstructStructName{privateelementType_element0;}

示例代碼

[InlineArray(10)]publicstructBuffer{privateint_element0;}Bufferbuffer=new();buffer[0]=1;buffer[9]=10;Console.WriteLine(buffer[0]);//1

適用場景

高性能計算。

替代不安全固定緩沖區(qū)。

注意事項

固定大小,運行時不可調整。

C# 13.0:參數集合擴展, 引用結構接口支持, 部分屬性

特性表格

類型/構造描述主要用途注意事項
參數集合擴展 (params Span等)擴展params支持Span等高性能參數傳遞需確保Span生命周期
引用結構接口支持允許ref struct實現接口擴展ref struct能力仍受ref struct限制
部分屬性 (partial properties)支持partial類型部分屬性代碼生成需確保定義一致

概述

參數集合擴展支持Span<T>等類型。ref struct可實現接口。部分屬性支持分文件定義。

語法

參數集合: void Method(params Span<T> spans);

引用結構接口: ref struct StructName : IInterface { ... }

部分屬性: public partial type Property { get; set; }

示例代碼

//參數集合擴展publicvoidProcess(paramsSpan<int>spans){foreach(varspan inspans)Console.WriteLine(string.Join(",",span.ToArray()));}int[]numbers=[1,2,3];Process(numbers.AsSpan(0,2),numbers.AsSpan(2,1));//1,2和3//引用結構接口支持publicinterfaceIBuffer{voidProcess();}refstructBuffer:IBuffer{publicSpan<int>Data;publicBuffer(Span<int>data)=>Data=data;publicvoidProcess()=>Data[0]=10;}Bufferbuffer=new(numbers.AsSpan());buffer.Process();Console.WriteLine(numbers[0]);//10//部分屬性publicpartialclassPerson{publicpartialstringName{get;set;}}publicpartialclassPerson{publicpartialstringName{get=>_name;set=>_name=value;}privatestring_name;}varperson=newPerson{Name="Alice"};Console.WriteLine(person.Name);//Alice

適用場景

高性能參數傳遞(參數集合)。

擴展ref struct(接口支持)。

代碼生成(部分屬性)。

注意事項

參數集合需管理Span生命周期。

部分屬性需確保一致性。

C# 14.0:field 關鍵字, 隱式 span 轉換, nameof 增強, lambda 參數修飾符, partial 成員擴展, 空條件賦值

特性表格

類型/構造描述主要用途注意事項
field 關鍵字允許在屬性訪問器中直接訪問 backing field簡化屬性實現可能與現有字段名沖突,需使用 @fieldthis.field 區(qū)分
隱式 span 轉換支持 Span<T>、ReadOnlySpan<T> 與數組間的隱式轉換更自然地使用 span 類型需注意 span 的生命周期
nameof 支持未綁定泛型允許 nameof 使用未綁定泛型類型,如 nameof(List<>)泛型編程中的類型名稱獲取-
lambda 參數修飾符允許 lambda 參數使用 refout 等修飾符,無需指定類型增強 lambda 表達式的靈活性params 仍需指定類型
partial 構造函數和事件擴展 partial 成員到實例構造函數和事件分離定義和實現,適合代碼生成需確保 defining 和 implementing 聲明一致
空條件賦值允許在賦值左側使用 ?.?[],僅在左側非 null 時賦值簡化 null 檢查不支持 ++--

概述

C# 14.0(預計2025年隨.NET 10發(fā)布,截至2025年4月為預覽版)引入了一系列語言特性,旨在提高開發(fā)效率和代碼可讀性,包括 field 關鍵字、隱式 span 轉換、nameof 增強、lambda 參數修飾符、partial 成員擴展和空條件賦值。雖然未引入全新數據類型,但這些特性顯著增強了現有類型的用法。

field 關鍵字概述

field 關鍵字允許在屬性訪問器中直接訪問編譯器生成的 backing field,無需顯式聲明。

示例代碼

publicclassPerson{publicstringName{get=>field;set=>field=value?.Trim();}}varperson=newPerson{Name="Alice"};Console.WriteLine(person.Name);//Alice

適用場景

簡化屬性實現,特別是需要對 setter 進行處理時。

注意事項

如果類中已有名為 field 的字段,需使用 @fieldthis.field 區(qū)分。

作為C# 13.0的預覽特性,C# 14.0正式支持,詳見field 關鍵字。

隱式 span 轉換概述

C# 14.0 為 Span<T>ReadOnlySpan<T> 提供了與數組的隱式轉換,使其使用更加自然。

示例代碼

Span<int>span =newint[]{1,2,3};int[]array=span.ToArray();Console.WriteLine(string.Join(",",array));//1,2,3

適用場景

高性能場景中,減少顯式轉換。

與數組和 span 類型交互。

注意事項

需確保 span 的生命周期管理,詳見Span 轉換。

nameof 支持未綁定泛型概述

允許 nameof 操作符使用未綁定泛型類型。

示例代碼

stringlistName=nameof(List<>);Console.WriteLine(listName);//List

適用場景

泛型編程中,獲取類型名稱。

注意事項

簡單但強大的增強,適合反射場景。

lambda 參數修飾符概述

允許在 lambda 表達式中為參數添加修飾符,如 ref、out 等,無需指定類型。

示例代碼

varincrement=(refintx)=>x++;intnum=5;increment(refnum);Console.WriteLine(num);//6

適用場景

需要在 lambda 中修改外部變量。

注意事項

params 仍需指定類型,詳見lambda 表達式。

partial 構造函數和事件概述

擴展 partial 成員到實例構造函數和事件,允許在 partial 類型中分離定義和實現。

示例代碼

//File1.cspublicpartialclassMyClass{publicpartialMyClass(intx);publicpartialeventEventHandlerMyEvent;}//File2.cspublicpartialclassMyClass{publicpartialMyClass(intx){}publicpartialeventEventHandlerMyEvent;}

適用場景

代碼生成場景,如 UI 設計器。

注意事項

需確保 defining 和 implementing 聲明一致,詳見partial 成員。

空條件賦值概述

允許在賦值語句的左側使用 ?.?[],僅當左側非 null 時執(zhí)行賦值。

示例代碼

string?text=null;text?.Length=5;//不執(zhí)行賦值List<int>?list=null;list?[0]=10;//不執(zhí)行賦值list=newList<int>{0};list?[0]=10;//執(zhí)行賦值,list[0]=10Console.WriteLine(list[0]);//10

適用場景

簡化 null 檢查,避免 NullReferenceException。

注意事項

不支持 ++-- 操作,詳見空條件賦值。

結語

C# 7.0至C# 14.0的類型系統(tǒng)新增內容涵蓋了值元組、Span、ReadOnlySpan、Memory、ReadOnlyMemory、可空引用類型、記錄、本機大小整數、記錄結構、內聯數組等數據類型,以及只讀結構、引用結構、必需成員、泛型數學支持等增強。C# 14.0通過field關鍵字、隱式 span 轉換等特性進一步優(yōu)化了現有類型的用法。這些特性滿足了從高性能內存管理到類型安全建模的多種需求。資深C#工程師可根據場景選擇類型,如使用Span優(yōu)化性能,記錄建模數據。由于C# 14.0尚在預覽階段,建議關注dotnet/roslyn以獲取最新更新。

到此這篇關于C#類型系統(tǒng)從7.0到14.0的發(fā)展歷程和版本特性的文章就介紹到這了,更多相關C#高性能開發(fā)之類型系統(tǒng):從 C# 7.0 到 C# 14 的類型系統(tǒng)演進全景內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#實現計算器窗體程序

    C#實現計算器窗體程序

    這篇文章主要為大家詳細介紹了C#實現計算器窗體程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Unity實戰(zhàn)之FlyPin(見縫插針)小游戲的實現

    Unity實戰(zhàn)之FlyPin(見縫插針)小游戲的實現

    這篇文章主要介紹了利用Unity制作FlyPin(見縫插針)小游戲的實現方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起試一試
    2022-01-01
  • winform獲取當前名稱實例匯總

    winform獲取當前名稱實例匯總

    這篇文章主要介紹了winform獲取當前名稱實例匯總,包括常見的目錄名、文件名、路徑等,非常實用,需要的朋友可以參考下
    2014-10-10
  • C# ??祐isionmaster二次開發(fā)環(huán)境搭建

    C# ??祐isionmaster二次開發(fā)環(huán)境搭建

    本文主要介紹了C# ??祐isionmaster二次開發(fā)環(huán)境搭建,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • C# 線程同步詳解

    C# 線程同步詳解

    本文主要介紹了C#中線程同步的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 關于C#中的字體別名問題

    關于C#中的字體別名問題

    在C#中使用Graphics對象的DrawString方法繪制文本時,可以通過設置TextRenderingHint屬性來控制字體混疊效果,對于14號或更大的字體,建議使用AntiAliasGridFit;對于8到14點之間的字體,建議使用AntiAlias;對于小于8點的字體,建議使用ClearTypeGridFit
    2025-01-01
  • C#連接MySql數據庫的方法

    C#連接MySql數據庫的方法

    最近兩天在解決C#連接MySql數據庫的問題,通過不同的從網上學習,最終找到了解決的辦法,現在和大家分享一下
    2013-10-10
  • C#調用C++的dll兩種實現方式(托管與非托管)

    C#調用C++的dll兩種實現方式(托管與非托管)

    這篇文章主要介紹了C#調用C++的dll兩種實現方式(托管與非托管),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C#獲取U盤序列號的方法

    C#獲取U盤序列號的方法

    這篇文章主要介紹了C#獲取U盤序列號的方法,涉及C#針對硬件底層信息操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 一起詳細聊聊C#中的Visitor模式

    一起詳細聊聊C#中的Visitor模式

    Visitor模式表示一個作用于某對象結構中的各元素的操作,下面這篇文章主要給大家介紹了關于C#中Visitor模式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論

页游| 平邑县| 阳朔县| 高雄县| 桐柏县| 古浪县| 永泰县| 合阳县| 临湘市| 普洱| 泰兴市| 高台县| 无棣县| 云安县| 德江县| 安溪县| 镇平县| 太白县| 凤山县| 汾西县| 方城县| 峨眉山市| 旅游| 鲁山县| 宁都县| 清流县| 宁夏| 泌阳县| 凤冈县| 茌平县| 嘉义县| 宜都市| 错那县| 文登市| 襄樊市| 皋兰县| 阳谷县| 永顺县| 长兴县| 海林市| 嘉善县|