C#6.0新特性の試み

4350 ワード

プロジェクトがアップグレードされたためです.NetFramework 4.6.1、開発ツールはvs 2015に転向し、C#6.0を試した.その結果、ネット上で検索したいくつかのチュートリアルはあまり完全ではなく、vs公式版の発表に伴って修正されたコードもある.それらのチュートリアルも更新されていません.だから自分が学んだことを記録します.
1.自動プロパティ初期化(Auto-property initializers)
    public class Account
    {

        public string Name { get; set; } = "summit";

        public int Age { get; set; } = 22;

        public IList AgeList
        {
            get;
            set;
        } = new List { 10,20,30,40,50 };

    }

読み取り専用属性についてもこのように直接初期化(C#5.0ではサポートされていません)したり、コンストラクション関数で直接初期化したりすることができます.
public class Customer
{
    public string Name { get; }
    public Customer(string first, string last)
    {
        Name = first + " " + last;
    }
}

2.文字列埋め込み値(String interpolation)
以前のバージョンのString.Formatに何個のパラメータがあるか、何個のプレースホルダを書くかは順序に従わなければならない.そうしないと、エラーが報告される.パラメータが多いので、このようにすると確かに頭が痛いです.新しいバージョンでは、文字列の前に$で後の文字を識別するために{オブジェクト}をプレースホルダとして使用することができる.例を見てください.
Console.WriteLine($"  :{account.Age}    :{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"  :{account.Age}");
Console.WriteLine($"{(account.Age<=22?"   ":"   ")}");

もし{あるいは}記号を出力したいならば、2つ書けばいいです.例えば$「{」.この$記号に注意してください.ネット上のNマルチチュートリアルにはこれがありません.直接「{account.Age}」です.この方法は新しいバージョンでは捨てられています.
3.静的クラスのインポート(Using Static)
Mathという静的クラスを使用する前にSystemネーミングスペースを導入してから使用する.この静的を直接インポートし、コードで直接その関数を使用することができる.
using static System.Math;//           

Console.WriteLine($"       : {Math.Pow(4, 2)}");
Console.WriteLine($"          : {Pow(4,2)}");

注意ここはusing static...あるネーミング空間にn個の方法がある場合、この方法ですべての方法を参照することなく単一の静的クラスを直接導入するのは便利である.
4.Null演算子(Null-conditional operators)
前にこのような判断コードを無数に書いたことがあります.
if (*** != null)
{
     //  null   
}
return null;

このように簡略化することができる.
var age = account.AgeList?[0].ToString();

Console.WriteLine("{0}", (person.list?.Count ?? 0));

もしAgeListが空の場合、式全体が空に戻る、そうでない場合、後の式の値が返される.
5.オブジェクトイニシエータ(Index Initializers)
このようにして辞書や他のオブジェクトにインデックス付与により初期化することができる.
IDictionary dict = new Dictionary() {
       [1]="first",
       [2]="second"
};
foreach(var dic in dict)
{
    Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
}

output:
key: 1 value:first
key: 2 value:second

6.異常フィルタ(Exception filters)
private static bool Log(Exception e)
{
    Console.WriteLine("log");
    return true;
}
static void TestExceptionFilter()
{
    try
    {
        Int32.Parse("s");
    }
    catch (Exception e) when (Log(e))
    {
        Console.WriteLine("catch");
        return;
    }
}

 when()        true,       ,    catch     .

7.nameof式(nameof expressions)
                :
private static void Add(Account account)
{
     if (account == null)
         throw new ArgumentNullException("account");
}

             ,               .
  nameof    ,                       (-_-!          )
private static void Add(Account account)
{
     if (account == null)
         throw new ArgumentNullException(nameof(account));
}

8.cathとfinally文ブロックでawait(Await in catch and finally blocks)を使用する
c#5.0        .

Resource res = null;
try
{
    res = await Resource.OpenAsync(…);       // 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.
}

9.属性にLambda式(Expression bodies on property-like function members)を使用する
public string Name =>string.Format("  : {0}", "summit");

public void Print() => Console.WriteLine(Name);

10.メソッドメンバーでLambda式を使用する
static int LambdaFunc(int x, int y) => x*y;

public void Print() => Console.WriteLine(First + " " + Last);

 
C#6.0の新たに増加する言語特性についてはこれまでもこれだけである.新しい機能はありません.もっと多いのは文法糖の改善です.開発はより快適で迅速である.最後にgithubのc#6.0に関する紹介リンクを添付します:私をクリックします
  
 
転載先:https://www.cnblogs.com/summit7ca/p/5319647.html