C#6.0 / 7.xの新機能()

レコードの中には、書き込みコードに役立つことが、通常は、新機能のようではないでしょう

C#6.0

自動初期化プロパティ

初期化の場合には、式は、プロパティを初期化するために後で使用されます

public ICollection<double> Grades { get; } = new List<double>();

主な表現の一員として

機能のこの属性/値の代わりに初期化する、各コールに再計算され、これは以前のようなビットであってもよいが、効果は完全に異なっています

public override string ToString() => $"{LastName}, {FirstName}";
//或者
public string FullName => $"{FirstName} {LastName}";

静的参照

using静的を増やし、静的メソッドは直接名前空間を参照することができますが、それは、クラス名の前にはなりません。

using static System.Math;

その後、あなたは直接参照することができますSin/ Sqrt書き込みするのではなく、他の方法をMath.Sin

空の条件演算子?.

これは、元をたどります

var handler = this.SomethingHappened;
if (handler != null)
    handler(this, eventArgs);

に単純化することができます。

// preferred in C# 6:
this.SomethingHappened?.Invoke(this, eventArgs);

文字列の連結

これは、従来の文字列フォーマットからの位置に基づいて、非常に便利な機能です

public string FullName
{
    get
    {
        return string.Format("{0} {1}", FirstName, LastName);
    }
}

追加することにより、文字列の前に$記号を、変数を文字列に直接持ち込むことができます。

public string FullName => $"{FirstName} {LastName}";

例外フィルタ

try/catch異常文のタイプに加えて、だけでなく、スルーwhenフィルタ演算子追加条件:

public static async Task<string> MakeRequest()
{
    WebRequestHandler webRequestHandler = new WebRequestHandler();
    webRequestHandler.AllowAutoRedirect = false;
    using (HttpClient client = new HttpClient(webRequestHandler))
    {
        var stringTask = client.GetStringAsync("https://docs.microsoft.com/en-us/dotnet/about/");
        try
        {
            var responseText = await stringTask;
            return responseText;
        }
        catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
        {
            return "Site Moved";
        }
    }
}

nameof表現

がNameOf変数名の文字列表現を返します

if (IsNullOrWhiteSpace(lastName))
    throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));

もちろん、あなたが文字列の固定値に直接書き込むことができますが、がNameOfによって、時にコードエディタが給付がNameOfのある変更を自動化するのに役立ちますVS、変数名の再構築、

awaitで使用することを許可catch/finallyコードブロック

C#は許可されていない前に、これがあります。しかし、新しい例外を導入しないように注意してください、または元の異常は表示されません。

インデックスを初期化することにより、

配列型のセットは、より親しみやすい初期化構文をサポートして簡単に初期化されますが、ではないので、簡単に辞書などに良いと他の非リニアアレイの初期化など、今#、Cすることができます前に:

private Dictionary<int, string> webErrors = new Dictionary<int, string>
{
    [404] = "Page not Found",
    [302] = "Page moved, but left a forwarding address.",
    [500] = "The web server can't come out to play today."
};

アレイの初期化展開Add方法

Collectionあなたは、クラスを初期化する初期化メソッドのセットを使用する場合は、クラスが実装しなければならないAdd方法を

public class Enrollment : IEnumerable<Student>
{
    private List<Student> allStudents = new List<Student>();

    public void Enroll(Student s)
    {
        allStudents.Add(s);
    }

    public IEnumerator<Student> GetEnumerator()
    {
        return ((IEnumerable<Student>)allStudents).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<Student>)allStudents).GetEnumerator();
    }
}

//这在之前版本是不行的,因为Enrollment类只有Enroll,没有Add方法
var classList = new Enrollment()
{
    new Student("Lessie", "Crosby"),
    new Student("Vicki", "Petty"),
    new Student("Ofelia", "Hobbs")
};

さて、によるEnrollと対応Add方法、それ。

public static class StudentExtensions
{
    public static void Add(this Enrollment e, Student s) => e.Enroll(s);
}

より良いオーバーロードされた裁判官

static Task DoThings() 
{
     return Task.FromResult(0); 
}
Task.Run(DoThings); 

以前のバージョンでは、コールを認識しないコンパイラがされTask.Run(Action)、まだTask.Run(Func<Task>())、与えられている
正しくとしてそれを認識することができ、コンパイラの新バージョンTask.Run(Func<Task>())

コンパイルされた出力を決定

C#のも変化など、それぞれ独立して生成されたタイムスタンプ、GUID、についての情報を追加するためのソースコードは、変更しない場合でも、バイナリファイルをコンパイル
追加することにより-deterministic、コンパイラがバイナリ出力まったく同じそれぞれの時間を生成することを可能にするオプションを

おすすめ

転載: www.cnblogs.com/mosakashaka/p/12608195.html