一小時學會C# 6

c# 6已經(jīng)出來有一段時間了荡含,今天我們就詳細地看一下這些新的特性。

一想虎、字符串插值 (String Interpolation)

C# 6之前我們拼接字符串時需要這樣

 var Name = "Jack";
 var results = "Hello" + Name;

或者

 var Name = "Jack";
 var results = string.Format("Hello {0}", Name);

但是C#6里我們就可以使用新的字符串插值特性

  var Name = "Jack";
  var results = $"Hello {Name}";

上面只是一個簡單的例子翩隧,想想如果有多個值要替換的話,用C#6的這個新特性购城,代碼就會大大減小,而且可讀性比起之前大大增強

 Person p = new Person {FirstName = "Jack", LastName = "Wang", Age = 100};
 var results = string.Format("First Name: {0} LastName: {1} Age: { 2} ", p.FirstName, p.LastName, p.Age);

有了字符串插值后:

 var results = $"First Name: {p.FirstName} LastName: {p.LastName} Age: {p.Age}";

字符串插值不光是可以插簡單的字符串虐译,還可以直接插入代碼

Console.WriteLine($"Jack is saying { new Tools().SayHello() }");

 var info = $"Your discount is {await GetDiscount()}";

那么如何處理多語言呢瘪板?

我們可以使用 IFormattable

下面的代碼如何實現(xiàn)多語言?

 Double remain = 2000.5; 
 var results= $"your money is {remain:C}";  

# 輸出 your money is $2,000.50

使用IFormattable 多語言

class Program
{
    static void Main(string[] args)
    {

        Double remain = 2000.5; 

       var results= ChineseText($"your money is {remain:C}");

        Console.WriteLine(results);
        Console.Read();
    }

    public static string ChineseText(IFormattable formattable)
    {
        return formattable.ToString(null, new CultureInfo("zh-cn"));
    }
}

# 輸出  your money is ¥2,000.50

二菱蔬、空操作符 ( ?. )

C# 6添加了一個 ?. 操作符篷帅,當一個對象或者屬性職為空時直接返回null, 就不再繼續(xù)執(zhí)行后面的代碼史侣,在之前我們的代碼里經(jīng)常出現(xiàn) NullException, 所以我們就需要加很多Null的判斷拴泌,比如

 if (user != null && user.Project != null && user.Project.Tasks != null && user.Project.Tasks.Count > 0)
 {
   Console.WriteLine(user.Project.Tasks.First().Name);
}

現(xiàn)在我們可以不用寫 IF 直接寫成如下這樣

Console.WriteLine(user?.Project?.Tasks?.First()?.Name);

這個?. 特性不光是可以用于取值,也可以用于方法調(diào)用惊橱,如果對象為空將不進行任何操作蚪腐,下面的代碼不會報錯,也不會有任何輸出税朴。

 class Program
{
    static void Main(string[] args)
    {
        User user = null;
        user?.SayHello();
        Console.Read();
    }
}

public class User
{
    public void SayHello()
    {
        Console.WriteLine("Ha Ha");
    }
}

還可以用于數(shù)組的索引器

class Program
{
    static void Main(string[] args)
    {
        User[] users = null;

        List<User> listUsers = null;

        // Console.WriteLine(users[1]?.Name); // 報錯
        // Console.WriteLine(listUsers[1]?.Name); //報錯

        Console.WriteLine(users?[1].Name); // 正常
        Console.WriteLine(listUsers?[1].Name); // 正常

        Console.ReadLine();
    }
}

<strong>注意: 上面的代碼雖然可以讓我們少些很多代碼回季,而且也減少了空異常,但是我們卻需要小心使用正林,因為有的時候我們確實是需要拋出空異常泡一,那么使用這個特性反而隱藏了Bug</strong>

三、 NameOf

過去觅廓,我們有很多的地方需要些硬字符串鼻忠,導致重構(gòu)比較困難,而且一旦敲錯字母很難察覺出來杈绸,比如

if (role == "admin")
{
}

WPF 也經(jīng)常有這樣的代碼

public string Name
{
  get { return name; }
  set
  {
      name= value;
      RaisePropertyChanged("Name");
  }
}

現(xiàn)在有了C#6 NameOf后帖蔓,我們可以這樣

public string Name
{
  get { return name; }
  set
  {
      name= value;
      RaisePropertyChanged(NameOf(Name));
  }
}

  static void Main(string[] args)
    {
        Console.WriteLine(nameof(User.Name)); //  output: Name
        Console.WriteLine(nameof(System.Linq)); // output: Linq
        Console.WriteLine(nameof(List<User>)); // output: List
        Console.ReadLine();
    }

<strong>注意: NameOf只會返回Member的字符串矮瘟,如果前面有對象或者命名空間,NameOf只會返回 . 的最后一部分, 另外NameOf有很多情況是不支持的塑娇,比如方法澈侠,關(guān)鍵字,對象的實例以及字符串和表達式</strong>

四埋酬、在Catch和Finally里使用Await

在之前的版本里哨啃,C#開發(fā)團隊認為在Catch和Finally里使用Await是不可能,而現(xiàn)在他們在C#6里實現(xiàn)了它写妥。

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

五棘催、表達式方法體

一句話的表達式可以直接寫成箭頭函數(shù),而不再需要大括號

class Program
{
private static string SayHello() => "Hello World";
private static string JackSayHello() => $"Jack {SayHello()}";

    static void Main(string[] args)
    {
        Console.WriteLine(SayHello());
        Console.WriteLine(JackSayHello());
        
        Console.ReadLine();
    }
}

六耳标、自動屬性初始化器

之前我們需要賦初始化值醇坝,一般需要這樣

public class Person
{
    public int Age { get; set; }

    public Person()
    {
        Age = 100;
    }
}

但是C# 6的新特性里我們這樣賦值

public class Person
{
    public int Age { get; set; } = 100;
}

七、只讀自動屬性

C# 1里我們可以這樣實現(xiàn)只讀屬性

public class Person
{
    private int age=100;

    public int Age
    {
        get { return age; }
    }
}

但是當我們有自動屬性時次坡,我們沒辦法實行只讀屬性呼猪,因為自動屬性不支持readonly關(guān)鍵字,所以我們只能縮小訪問權(quán)限

public class Person
{
    public  int Age { get; private set; }
   
}

但是 C#6里我們可以實現(xiàn)readonly的自動屬性了

public class Person
{
    public int Age { get; } = 100;
}

八砸琅、異常過濾器 Exception Filter

   static void Main(string[] args)
    {

        try
        {
            throw  new ArgumentException("Age");
        }
        catch (ArgumentException argumentException) when( argumentException.Message.Equals("Name"))
        {
            throw  new ArgumentException("Name Exception");

        }

        catch (ArgumentException argumentException) when( argumentException.Message.Equals("Age"))
        {
            throw new Exception("not handle");
            
        }
        catch  (Exception e)
        {
            
            throw;
        }
    }

在之前宋距,一種異常只能被Catch一次,現(xiàn)在有了Filter后可以對相同的異常進行過濾症脂,至于有什么用谚赎,那就是見仁見智了,我覺得上面的例子诱篷,定義兩個具體的異常 NameArgumentException 和AgeArgumentException代碼更易讀壶唤。

九、 Index 初始化器

這個主要是用在Dictionary上棕所,至于有什么用闸盔,我目前沒感覺到有一點用處,誰能知道很好的使用場景琳省,歡迎補充:

var names = new Dictionary<int, string>
        {
            [1] = "Jack",
            [2] = "Alex",
            [3] = "Eric",
            [4] = "Jo"
        };

        foreach (var item in names)
        {
            Console.WriteLine($"{item.Key} = {item.Value}");
        }

十迎吵、using 靜態(tài)類的方法可以使用 static using

這個功能在我看來,同樣是很沒有用的功能针贬,也為去掉前綴有的時候我們不知道這個是來自哪里的击费,而且如果有一個同名方法不知道具體用哪個,當然經(jīng)證實是使用類本身的覆蓋桦他,但是容易搞混不是嗎蔫巩?

using System;
using static System.Math;
namespace CSharp6NewFeatures
 {
  class Program
  {
      static void Main(string[] args)
    {
        Console.WriteLine(Log10(5)+PI);
    }
  }
}

總結(jié)

上面一到八我認為都是比較有用的新特性,后面的幾個我覺得用處不大,當然如果找到合適的使用場景應該有用批幌,歡迎大家補充础锐。

最后,祝大家編程愉快荧缘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皆警,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子截粗,更是在濱河造成了極大的恐慌信姓,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绸罗,死亡現(xiàn)場離奇詭異意推,居然都是意外死亡,警方通過查閱死者的電腦和手機珊蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門菊值,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人育灸,你說我怎么就攤上這事腻窒。” “怎么了磅崭?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵儿子,是天一觀的道長。 經(jīng)常有香客問我砸喻,道長柔逼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任割岛,我火速辦了婚禮愉适,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜂桶。我一直安慰自己儡毕,他們只是感情好也切,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布扑媚。 她就那樣靜靜地躺著,像睡著了一般雷恃。 火紅的嫁衣襯著肌膚如雪疆股。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天倒槐,我揣著相機與錄音旬痹,去河邊找鬼。 笑死,一個胖子當著我的面吹牛两残,可吹牛的內(nèi)容都是我干的永毅。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼人弓,長吁一口氣:“原來是場噩夢啊……” “哼沼死!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崔赌,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤意蛀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后健芭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體县钥,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年慈迈,在試婚紗的時候發(fā)現(xiàn)自己被綠了若贮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡痒留,死狀恐怖兜看,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狭瞎,我是刑警寧澤细移,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站熊锭,受9級特大地震影響弧轧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碗殷,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一精绎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌妻,春花似錦代乃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吭历,卻和暖如春堕仔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晌区。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工摩骨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留通贞,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓恼五,卻偏偏與公主長得像昌罩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灾馒,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理峡迷,服務(wù)發(fā)現(xiàn),斷路器你虹,智...
    卡卡羅2017閱讀 134,720評論 18 139
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,239評論 0 4
  • 蘋果官方文檔翻譯 《Objective-C語言編程》(Programming with Objective-C) ...
    fever105閱讀 25,713評論 19 130
  • 成年的我們 總是忘了把心圈存 總喜歡拿大把的青春去荒唐 因為青春 出處年輕 好奇感情 總要隨心隨性地愛那么一個人 ...
    一個叫李柯的女孩閱讀 216評論 0 2
  • 在孤單和吵鬧中切換绘搞,有些不容易。前天還吵吵鬧鬧的打慣蛋說臟話傅物,現(xiàn)在又回到一個人的空氣中夯辖。自我意識里,我是喜歡寂寞的...
    Wisconsin0607閱讀 175評論 0 0