Below you will find pages that utilize the taxonomy term “CSharp 7.0”
Posts
'C# 7.0 - Out variables'
C# 7.0 以前使用的方法若有 Out 參數,需要事先宣告才能帶入使用。
... string data; GetData(out data); ... static void GetData(out string data) { ... } C# 7.0 以後,可以在帶入 Out 參數時直接順帶宣告。
... GetData(out string data); ... 也可以結合使用區域型別推斷。
... GetData(out var data); ... 完整的範例程式如下:
using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { GetData(out string data); //GetData(out var data); Console.WriteLine($"{data}"); } static void GetData(out string data) { data = "Level Up (http://larrynung.github.io/)"; } } } 運行結果如下:
read morePosts
'C# 7.0 - Throw expressions'
C# 7.0 開始支援 Throw expressions。
三元運算中可以視需要直接丟出 exception。
... this.FirstName = firstName == null ? throw new ArgumentNullException(nameof(firstName)) : firstName; ... ?? 運算式中也可以直接丟出 exception。
... this.LastName = lastName ?? throw new ArgumentNullException(nameof(lastName)); ... Expression bodied member 也可以丟出 exception。
... public override string ToString() => throw new NotImplementedException(); ... 最後附上完整的測試範例:
class Program { static void Main(string[] args) { var person = new Person("Larry", "Nung"); Console.WriteLine(person.ToString()); } } struct Person { public string FirstName { get; set; } public string LastName { get; set; } public Person(string firstName, string lastName) { this.
read morePosts
'C# 7.0 - More expression bodied members'
C# 7.0 擴展了 Expression bodied。
開始支援建構子。
... class Program { ... public Program() => Console.WriteLine("Program()"); ... } ... 支援解構子。
... class Program { ... ~Program() => Console.WriteLine("~Program()"); ... } ... 支援 property accessors。
... private string _myProperty; public string MyProperty { get => _myProperty; set => _myProperty = value; } ... 支援 event accessors。
... public event EventHandler MyEvent { add => _myEvent += value; remove => _myEvent -= value; } .
read morePosts
'C# 7.0 - Deconstruction'
C# 7.0 新增 Deconstruction,可將 Tuple、結構、類別的成員拆解使用。
以 Tuple 為例,若想要將 Tuple 值拆解使用,可以用小括弧宣告出多個區域變數,並將 Value Tuple 指派過去,Value Tuple 的屬性值就會依序塞入這些區域變數。
(var v1, var v2) = GetTuple(); var (v1, v2) = GetTuple(); 若是結構或是類別,則要建一個 public 的 Deconstruct 方法,方法的參數用 out 將拆解出來的值依序傳出,編譯時編譯器就會自行幫我們調用 Deconstruct 方法將值拆解。
(var v1, var v2) = new MyClass(); ... class MyClass() { ... public void Deconstruct(out string v1, out string v2) { v1 = this.V1; v2 = this.V2; } } 若有需要 Deconstruct 也支援多載。
(var v1, var v2) = new MyClass(); .
read morePosts
'C# 7.0 - Tuple'
C# 7.0 新增了 Value Type 的 Tuple,因為是 Value Type,所以對 GC 的負擔會比較少。另外增加了一些語法糖,改進了本來 Tuple 類別可讀性不佳的問題。
使用上需先加入 System.ValueTuple 套件。
若不加入該套件編譯時會看到 System.ValueTuple is not defined or imported 的錯誤。
套件加入引用後我們可以看一下該套件的內容,可以看到有一堆泛型的 ValueTuple struct,裡面的成員屬性跟以往的 Tuple 一樣都是 Item1 ~ ItemN。
使用上可以直接建立 ValueTuple,然後在建立的同時指定其型態與值,在要取值的地方用 Item1 ~ ItemN 屬性來取值。
也可以用小括弧包住屬性值直接宣告。
但這樣的宣告方式跟舊的 Tuple 類別一樣有著可讀性不佳的問題,因此在用小括弧包住屬性值宣告的同時,我們將屬性名稱也一併指定,取值時就可以用指定的屬性名稱來取值。
編譯器在編譯時會自動幫你將程式轉換成 Item1 ~ ItemN。
若想要將 Tuple 值拆解使用,可以用小括弧宣告出多個區域變數,並將 Value Tuple 指派過去,Value Tuple 的屬性值就會依序塞入這些區域變數。
這些功能即使套用在方法的回傳值上也一樣適用。
Link Tackling Tuples: Understanding the New C# 7 Value Type - Our ComponentOne C# 7.0 – Tuples – CsharpStar Tuple deconstruction in C# 7 | Thomas Levesque’s .
read morePosts
C# 7.0 - Digit separators
以前在開發 C# 時,如果數值過大,在閱讀上會十分不易。
C# 7.0 以後提供了 Digit separators 功能,允許開發人員使用 _ 將數值做些分隔,有效解決了上述問題。最普遍的用法就是將數值做千分位分隔,像是下面這樣:
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var values = new int[] { 1_000, 1_000_000, 0b1_000 }; foreach (var value in values) { Console.WriteLine(value.ToString()); } } } } {% img /images/posts/CSharp7DigitSeparators/1.png %}
Link C# 7 features preview · Anton Sizikov Exploring Visual Studio “15” Preview and Playing with C# 7 Test driving C# 7 features in Visual Studio “15” Preview » Thomas Levesque’s .
read morePosts
C# 7.0 - Binary literals
在程式開發時,有時我們會需要使用二進制的數值,像是在使用標有 FlagsAttribute 的列舉值做權限時就會用到。在 C 7.0# 前我們必需要使用十進制數值表示法,確保他是二進制的數值。
在 C# 7.0 後開始支援二進制數值表示法,使用上只需用 0b 當做前綴即可,像是 0 可以寫成 0b00、1 可以寫成 0b01、2 可以寫成 0b10、4 可以寫成 0b100,以此類推。
using System; namespace ConsoleApplication1 class Program { static void Main(string[] args) { var values = new int[] { 0b00, 0b01, 0b10, 0b100, 0b1000 }; foreach (var value in values) { Console.WriteLine(value.ToString()); } } } } {% img /images/posts/CSharp7Binaryliterals/1.png %}
Link A glance at C# vNext - CodeProject
read morePosts
C# 7.0 - Local functions
有時候我們在開發程式時,會碰到一些情境是需要建立個方法,但這個方法只有某個地方會用到,這時我們多半是用委派去做掉,但帶來的問題就是會有額外的記憶體耗費,而且無法被 inline 處理。
C# 7.0 後,我們可以改用 Local functions 功能去處理。使用方式很簡單,就是一般的方法宣告,只是是寫在方法裡面。像是:
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { void SayHello(string name) { Console.WriteLine(string.Format("Hello~{0}", name)); } SayHello("Larry"); } } } 這邊也可以搭配使用 C# 6.0 的 Expression Bodied Members,程式碼會更為精簡。
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { void SayHello(string name) => Console.WriteLine(string.Format("Hello~{0}", name)); SayHello("Larry"); } } } 運行結果如下:
{% img /images/posts/CSharp7LocalFunctions/1.png %}
反組譯看一下:
{% img /images/posts/CSharp7LocalFunctions/2.
read more