国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

通過一個例子感受C# 6.0新特性

2019-11-17 02:38:39
字體:
來源:轉載
供稿:網友

通過一個例子感受C# 6.0新特性

微軟在Visual Studio 2015中更新C#語言到6.0,添加了很多很好的特性,以使C#語言繼續躋身于最優秀語言之行列。下面通過一個例子快速感受一下C# 6.0的新特性,以下程序在VS2015預覽版中測試通過,正式版可能還要添加新特性。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Console;namespace CSharp6Research{    //分數    public class Fraction    {        public int A { get; set; }        public int B { get; set; } = 1;        public string Separator { get; } = "/";        public string SeparatorSpaces { get; } = string.Empty;        public double Value => (double)A / B;        public int this[int index] => index == 0 ? A : B;        public int this[string index] => index == "A" ? A : B;        public override string ToString() => "/{A}/{SeparatorSpaces}/{Separator}/{SeparatorSpaces}/{B}";        public void PRint() => WriteLine(ToString());        public Fraction()        {        }        public Fraction(int a, int b)        {            A = a;            B = b;        }        public Fraction(int a, int b, string separatorSpaces) : this(a, b)        {            SeparatorSpaces = separatorSpaces;            if (string.IsNullOrEmpty(separatorSpaces))            {                throw new ArgumentNullException(nameof(separatorSpaces));            }        }        public static readonly Dictionary<string, Fraction> CommonFractions =            new Dictionary<string, Fraction>            {                ["zero"] = new Fraction(),                ["one"] = new Fraction(1, 1),                ["half"] = new Fraction(1, 2),                ["quarter"] = new Fraction(1, 4),                ["infinity"] = new Fraction(1, 0),            };    }    public struct FractionStruct    {        public int A { get; }        public int B { get; }        public FractionStruct(int a, int b) { A = a; B = b; }        public FractionStruct() : this(0, 1) { }        public override string ToString() => "/{A}//{B}";    }    class Program    {        static void Main(string[] args)        {            foreach (var f in Fraction.CommonFractions)            {                WriteLine("/{f.Key} : /{f.Value.Value}");            }            var fraction = new Fraction(1, 3, " ");            fraction.Print();            try            {                fraction = new Fraction(1, 2, null);            }            catch (ArgumentNullException e) if (e.ParamName == "separatorSpaces")            {                WriteLine("separatorSpaces can not be null");            }            Fraction v;            Fraction.CommonFractions.TryGetValue("harf", out v);            v?.Print();            var a = v?.A;            WriteLine(a == null);            var b = v?["B"];            WriteLine(b == null);            WriteLine(v?.ToString() == null);            WriteLine(new FractionStruct().ToString());            WriteLine(default(FractionStruct).ToString());        }    }}

運行結果如下,

zero : 0one : 1half : 0.5quarter : 0.25infinity : ∞1 / 3separatorSpaces can not be nullTrueTrueTrue0/10/0

1. Auto-property initializers 自動屬性初始化器

public int B { get ; set ; } = 1;

可以直接給自動屬性賦值了,不需要寫在構造函數中了。

2. Getter-only auto-properties 只讀自動屬性

public string SeparatorSpaces { get; } = string.Empty;

只讀自動屬性可以直接初始化,或者在構造函數中初始化。

3. Expression-bodied members 表達式體成員

public double Value => (double)A / B;

public int this[int index] => index == 0 ? A : B;

public void Print() => WriteLine(ToString());

只讀屬性,只讀索引器和方法都可以使用Lambda表達式作為Body。

4. String interpolation 字符串嵌入值

"/{A}/{SeparatorSpaces}/{Separator}/{SeparatorSpaces}/{B}";

反斜杠后的大括號中的表達式會在運行時計算值,并嵌入到字符串中。和Swift中很像,Swift中是反斜杠加小括號,C#是反斜杠加大括號。

5. nameof Operator nameof 運算符

throw new ArgumentNullException(nameof(separatorSpaces));

nameof會返回變量,參數或成員名。

這個很有用,原來寫WPF中的ViewModel層的屬性變化通知時,需要寫字符串,或者使用MvvmLight等庫中的幫助方法,可以傳入獲取屬性的Lambda,但由于是在運行時解析,會有少許性能損失。現在好了,使用nameof運算符,既能保證重構安全和可讀性,又能保證性能。

6. Dictionary initializer 字典初始化器

new Dictionary< string, Fraction>

{

["zero"] = new Fraction (),

["one"] = new Fraction (1, 1),

["half"] = new Fraction (1, 2),

["quarter"] = new Fraction (1, 4),

[ "infinity"] = new Fraction (1, 0),

};

現在字典可以用一種可讀性更好的方法進行初始化,方括號包圍的Key等于Value。

7. Parameterless struct ctors 無參數的結構體構造函數

public FractionStruct( int a, int b) { A = a; B = b; }

public FractionStruct() : this(0, 1) { }

結構體可以提供自定義的無參數構造函數了。

new FractionStruct()

default(FractionStruct)

new是調用無參數構造函數。

default是不調用無參數構造函數。

8. Exception filters 異常過濾器

catch (ArgumentNullException e) if (e.ParamName == "separatorSpaces")

{

WriteLine("separatorSpaces can not be null");

}

設置進入catch塊的條件。

9. Null propagation 空傳播

v?.A

v?["B"]

v?.ToString()

對象為null時不調用屬性,索引器,方法等,表達式返回null,和Swift中的用法相似。

10. Using static members using靜態導入

using System.Console ;

WriteLine("separatorSpaces can not be null" );

在using中可以指定一個靜態類,然后可以在隨后的代碼中直接使用該類的靜態方法,和java中的用法相似。

11. Await in catch/finally catch和finally塊中的await

例子如下, Resource res = null; try { res = await Resource.OpenAsync(&hellip;); // You could do this. … } catch (ResourceException e) { await Resource.LogAsync(res, e); // Now you can do this … } finally { if (res != null) await res.CloseAsync(); // … and this. }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣城市| 潍坊市| 隆德县| 惠安县| 东乡| 宁国市| 万山特区| 新乡市| 桂平市| 朝阳区| SHOW| 天镇县| 齐齐哈尔市| 洱源县| 阳西县| 海口市| 嵊州市| 福建省| 宜兴市| 绥中县| 伊川县| 张掖市| 汉寿县| 宾川县| 长顺县| 金塔县| 井陉县| 卓资县| 孝义市| 崇礼县| 晋城| 兴海县| 彭山县| 桑植县| 苗栗市| 辽中县| 五台县| 花莲市| 隆尧县| 阳山县| 平湖市|