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

C# 9.0 特性全面總結(jié)

 更新時間:2021年02月26日 08:32:20   作者:張志敏  
這篇文章主要介紹了C# 9.0 特性的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

頂級語句

頂級語句可以刪除程序中不必要的代碼, 以最簡單的 Hello, world! 為例:

using System;

namespace HelloWorld {

 class Program {

  static void Main(string[] args) {
   Console.WriteLine("Hello World!");
  }
 }
}

如果使用頂級語句的話, 可以簡化為:

using System;

Console.WriteLine("Hello World!");

如果不使用 using , 還可以更加簡化:

System.Console.WriteLine("Hello World!");

頂級語句在很多命令行程序、小工具程序中會非常有用, 對應(yīng)用程序的作用域或者復(fù)雜程度沒有任何限制。

注意, 一個程序中, 只能有一個文件使用頂級語句, 并且頂級語句必須位于命名空間或類型定義之前!

棄元參數(shù)

在 lambda 表達式或者匿名函數(shù)中如果要忽略某個參數(shù), 可以用 _ 代替。

var button = new Button("Click Me!");

button.Click += (_, e) => { /* other code goes here. */ };

僅初始化設(shè)置器 (Init only setters)

創(chuàng)建只能通過對象初始化進行賦值的屬性。

public class InitDemo {
 public string Start { get; init; }
 public string Stop { get; init; }
}

// initDemo.Start = "Now"; // Error
// initDemo.End = "Tomorrow"; // Error

var initDemo = new InitDemo {
 Start = "Now",
 Stop = "Tomorrow"
};

記錄類型 (Record)

記錄類型, 是一種引用類型, 默認是不可變的。 記錄類型的相等判斷可以通過引用或者結(jié)構(gòu)進行判斷的。

// 默認不可變的記錄類型
public record Person(string Name, int Age);
// 可變記錄類型
public record MutablePerson(string Name, int Age) {
 public string Name { get; set; } = Name;
 public int Age { get; set; } = Age;
}

var person1 = new Person("Zhimin Zhang", 40);
var person2 = new Person("Zhimin Zhang", 40);

Console.WriteLine(person1 == person2); // True 結(jié)構(gòu)相同
Console.WriteLine(person1.Equals(person2)); // True 結(jié)構(gòu)相同
Console.WriteLine(ReferenceEquals(person1, person2)); // False, 引用不同

// 改變默認的記錄! --> 創(chuàng)建一個新的記錄。
var person3 = person1 with { Age = 43 };
Console.WriteLine(person3 == person1); // False 結(jié)構(gòu)不同

// 解構(gòu) (Destruct) 一個記錄, 將記錄的屬性提取為本地變量
var (name, age) = person3;

var person4 = new MutablePerson("Zhimin zhang", 40);
person4.Age = 43;

var person5 = new Citizen("Zhimin Zhang", 40, "China");
Console.WriteLine(person1 == person5);

// 記錄類型也可以被繼承
public record Citizen(string Name, int Age, string Country) : Person(Name, Age);
var citizen = new Citizen("Zhimin Zhang", 40, "China");
Console.WriteLine(person1 == citizen); // False 類型不同;
  • 優(yōu)點:記錄類型是輕量級的不可變類型,可以減少大量的代碼, 可以按照結(jié)構(gòu)和引用進行比較;
  • 缺點:需要實例化大量的對象;

如果要更加深入的學(xué)習(xí)記錄類型, 請查看微軟的官方文檔 exploration of records 。

模式匹配增強

C# 9 包含了一些新的模式匹配增強:

Type patterns 類型匹配,判斷一個變量的類型

object obj = new int();
var type = obj switch {
 string => "string",
 int => "int",
 _ => "obj"
};
Console.WriteLine(type); // int

Relational patterns 關(guān)系匹配

// Relational patterns
var person1 = new Person("Zhimin Zhang", 40);
var inRange = person1 switch {
 (_, < 18) => "less than 18",
 (_, > 18) => "greater than 18",
 (_, 18) => "18 years old!"
};
Console.WriteLine(inRange); // greater than 18

Conjunctive and patterns 邏輯與匹配

// And pattern
var person1 = new Person("Zhimin Zhang", 40);
var ageInRange = person1 switch {
 (_, < 18) => "less than 18",
 ("Zhang Zhimin", _) and (_, >= 18) => "Zhimin Zhang is greater than 18"
};
Console.WriteLine(ageInRange); // Zhimin Zhang is greater than 18

Disjunctive or patterns 邏輯或匹配

// Or pattern
var person1 = new Person("Zhimin Zhang", 40);
var ageInRange = person1 switch {
 (_, < 18) => "less than 18",
 (_, 18) or (_, > 18) => "18 or greater"
};
Console.WriteLine(ageInRange); // 18 or greater

Negated not patterns 邏輯非匹配

// Not pattern
var person1 = new Person("Zhimin Zhang", 40);
var meOrNot = person1 switch {
 not ("Zhimin Zhang", 40) => "Not me!",
 _ => "Me :-)"
};
Console.WriteLine(meOrNot); // Me :-)

Parenthesized patterns 帶括號的優(yōu)先級匹配

// Parenthesized patterns
var is10 = new IsNumber(true, 10);
var n10 = is10 switch {
 ((_, > 1 and < 5) and (_, > 5 and < 9)) or (_, 10) => "10",
 _ => "not 10"
};
Console.WriteLine(n10); // 10

注意, 如果沒有匹配到全部的情況, 將會出現(xiàn)異常。

新的初始化表達式

在C#9.0中,當已創(chuàng)建對象的類型已知時,可以在new表達式中省略該類型。

public class MyClass {
 private List<WeatherObservation> _observations = new();
}

Point p = new(1, 1);
Dictionary<string, int> dict = new();

Point[] points = { new(1, 1), new (2, 2), new (3, 3) };
var list = new List<Point> {
 new(1, 1), new(2, 2), new(3, 3)
};
  • 優(yōu)點: 可以讓代碼更加簡潔;
  • 缺點: 某些情況下會讓代碼更難理解;

目標類型條件表達式

可以隱式轉(zhuǎn)換 null 值, 在 C#9.0 中得到了增強。

void TestMethod(int[] list, uint? u) {
 int[] x = list ?? new int[0];
 var l = u ?? -1u;
}

GetEnumerator 擴展

可以為任意類型添加一個 GetEnumerator<T> 擴展, 返回一個 IEnumerator<T> 或者 IAsyncEnumerator<T> 實例, 從而在 foreach 循環(huán)中使用。

public static class Extensions {
 public static IEnumerator<T> GetEnumerator<T>(this IEnumerator<T> enumerator) => enumerator;
}

IEnumerator<string> enumerator = new Collection<string> {
 "A", "B", "C"
}.GetEnumerator();

foreach (var item in enumerator) {
 Console.WriteLine(item);
}

在本地函數(shù)上添加標記

允許在本地函數(shù)上添加標記。

static void Main(string[] args) {
 
 [Conditional("DEBUG")]
 static void DoSomething([NotNull] string test) {
 Console.WriteLine("Do it!");
 }
 
 DoSomething("Doing!");
}

分部方法擴展

在C#9.0中,移除了分部方法的幾個限制:

  1. 必須具有 void 返回類型。
  2. 不能具有 out 參數(shù)。
  3. 不能具有任何可訪問性(隱式 private )。
partial class Doing {
 internal partial bool DoSomething(string s, out int i);
}

partial class Doing {
 internal partial bool DoSomething(string s, out int i) {
 i = 0;
 return true;
 }
}

靜態(tài) lambda 表達式

從 C#9.0 開始,可以將 static 修飾符添加到 lambda 表達式或 匿名方法 。靜態(tài) lambda 表達式類似于 static 局部函數(shù):靜態(tài)lambda或匿名方法無法捕獲局部變量或?qū)嵗隣顟B(tài)。 所述 static 可以防止意外捕獲其他變量。

lambda 表達式會捕獲上下文的變量,不僅會有性能的問題,而且還可能出現(xiàn)錯誤,比如:

int number = 0;

Func<string> toString = () => number.ToString(); // number 被自動捕獲進 toString 函數(shù)中

可以在 lambda 表達式前添加 static 關(guān)鍵字, 來解決這個問題:

int number = 0;
Func<string> toString = static () => number.ToString(); // 這里無法再使用 number ;

模塊初始化代碼

可以使用 ModuleInitializerAttribute 為組件 (assembly) 定義初始化代碼, 當初始化/加載時執(zhí)行, 可以類比類的靜態(tài)構(gòu)造函數(shù), 但是是組件級別的, 要求如下:

  • 必須是靜態(tài)的、無參數(shù)的、無返回值的方法;
  • 不能是范型方法,也不能包含在范型類中;
  • 不能是私有函數(shù),必須是公開 (public) 或者內(nèi)部 (internal) 的函數(shù);

協(xié)變返回類型

協(xié)變返回類型為重寫方法的返回類型提供了靈活性。覆蓋方法可以返回從覆蓋的基礎(chǔ)方法的返回類型派生的類型。這對于記錄和其他支持虛擬克隆或工廠方法的類型很有用。 比如:

public virtual Person GetPerson() { return new Person(); }

public override Person GetPerson() { return new Student(); }

在 C# 9.0 中, 可以在子類中返回更加詳細的類型:

public virtual Person GetPerson() { return new Person(); }

public Student Person GetPerson() { return new Student(); }

原生整數(shù)類型

C#9 添加了兩個新的整數(shù)類型 (nint 和 nunit) , 依賴宿主機以及編譯設(shè)定。

nint nativeInt = 55;
Console.WriteLine(nint.MaxValue);

// 在 x86 平臺上, 輸出為 2147483647

// 在 x64 平臺上, 輸出為 9223372036854775807
  • 優(yōu)點:可以更好的兼容原生API;
  • 缺點:缺失平臺無關(guān)性;

跳過本地初始化 (SkipLocalInit)

在 C#9.0 中,可以使用 SkipLocalsInitAttribute 來告知編譯器不要發(fā)射 (Emit) .locals init 標記。

[System.Runtime.CompilerServices.SkipLocalsInit]
static unsafe void DemoLocalsInit() {
 int x;
 // 注意, x 沒有初始化, 輸出結(jié)果不確定;
 Console.WriteLine(*&x);
}
  • 優(yōu)點:跳過本地初始化可以提升程序的性能;
  • 缺點:性能的影響通常不大,建議只在極端情況下才使用這個;

函數(shù)指針

使用 delegate* 可以聲明函數(shù)指針。

unsafe class FunctionPointer {
 static int GetLength(string s) => s.Length;
 delegate*<string, int> functionPointer = &GetLength;
}

public void Test() {
 Console.WriteLine(functionPointer("test")); // 4;
}

以上就是C# 9.0 特性全面總結(jié)的詳細內(nèi)容,更多關(guān)于C# 9.0 特性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Js中的substring,substr與C#中的Substring比較

    Js中的substring,substr與C#中的Substring比較

    本篇文章主要是對Js中的substring,substr與C#中的Substring進行了比較。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#創(chuàng)建Windows服務(wù)的實現(xiàn)方法

    C#創(chuàng)建Windows服務(wù)的實現(xiàn)方法

    這篇文章主要介紹了C#創(chuàng)建Windows服務(wù)的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • C# Socket網(wǎng)絡(luò)編程實例

    C# Socket網(wǎng)絡(luò)編程實例

    這篇文章主要介紹了C# Socket網(wǎng)絡(luò)編程實例,分析了Socket網(wǎng)絡(luò)通信的原理與具體應(yīng)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯

    DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯

    這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下
    2014-08-08
  • C#圖表開發(fā)之Chart詳解

    C#圖表開發(fā)之Chart詳解

    C#中的Chart控件用于開發(fā)圖表功能,具有Series和ChartArea兩個重要屬性,Series屬性是SeriesCollection類型,包含多個Series對象,每個Series代表圖表中的一個數(shù)據(jù)系列,Series對象有一個Points屬性,用于存儲數(shù)據(jù)點,每個數(shù)據(jù)點是一個DataPoint對象
    2024-12-12
  • unity通過Mesh網(wǎng)格繪制圖形球體

    unity通過Mesh網(wǎng)格繪制圖形球體

    這篇文章主要為大家詳細介紹了unity通過Mesh網(wǎng)格繪制圖形球體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#中哈希表(HashTable)用法實例詳解(添加/移除/判斷/遍歷/排序等)

    C#中哈希表(HashTable)用法實例詳解(添加/移除/判斷/遍歷/排序等)

    這篇文章主要介紹了C#中哈希表(HashTable)用法,簡單講述了哈希表的原理并結(jié)合實例形式詳細分析了C#針對哈希表進行添加、移除、判斷、遍歷、排序等操作的實現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • C#中日期時間的簡單操作

    C#中日期時間的簡單操作

    這篇文章介紹了C#中日期時間的簡單操作,有需要的朋友可以參考一下
    2013-08-08
  • 日常收集C#接口知識(知識全面)

    日常收集C#接口知識(知識全面)

    本文分為七章節(jié)給大家介紹c#接口知識,內(nèi)容比較詳細,特此分享腳本之家平臺,供大家參考
    2016-01-01
  • C#中字符串優(yōu)化String.Intern、IsInterned詳解

    C#中字符串優(yōu)化String.Intern、IsInterned詳解

    這篇文章主要給大家介紹了關(guān)于C#中字符串優(yōu)化String.Intern、IsInterned的相關(guān)資料,文中通過示例代碼介紹的,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-12-12

最新評論

普定县| 新野县| 健康| 新龙县| 柳河县| 定陶县| 错那县| 南雄市| 寿光市| 咸丰县| 景洪市| 宜阳县| 当涂县| 阿拉善左旗| 兴城市| 武清区| 清涧县| 三原县| 宁德市| 蓝田县| 商水县| 嘉定区| 西盟| 元朗区| 瓮安县| 濮阳县| 建宁县| 读书| 中西区| 九江县| 江城| 上虞市| 图片| 尉氏县| 沁阳市| 昌图县| 高尔夫| 武夷山市| 图片| 阜南县| 沐川县|