web-dev-qa-db-ja.com

C#6のnull条件演算子と文字列補間

null-conditional operator および interpolated strings 構文は syntactic sugar に解決されますか?

ヌル条件演算子(?.)を使用すると、「過剰」なnullチェックと、補間された文字列(("\{X}, \{Y}"))は、引数とフォーマットを1つにまとめたもので、C#6の新機能です。

これらは望ましくない対応物(つまり、回避しようとした醜いコード)にコンパイルされますか?

私はナイーブな質問をお詫び申し上げます。一般に言語を最もよく理解していませんが、これらの機能をC#5などで実行できるかどうか知りたいです。

これはJavaの場合に当てはまることですが、これらの例にも当てはまりますか?

18
ChiefTwoPencils

一般的なルールはありません、それは異なります。いくつかの機能は単に構文上の砂糖であり、いくつかは以前は不可能であった機能を追加し、いくつかは両方の組み合わせです。

構文糖

  • 文字列補間-これ:

    string result = $"{bar}";
    

    の代わりに:

    string result = string.Format("{0}", bar);
    
  • ヌル伝播演算子(?.) - この:

    var result = Foo()?.Length
    

    の代わりに:

    var temp = Foo();
    var result = (temp != null) ? temp.Length : null;
    

新しい機能

  • 文字列補間-IFormattableを使用したFormattedStringのサポートも追加しているため、これが可能です。

    IFormattable result =  $"{bar}"
    
  • Catch/finallyで待機-awaitおよびcatchブロックでfinallyを使用できるようになりました。

    try
    {
    }
    catch
    {
        await Task.Delay(1000);
    }
    

もちろん、両方のカテゴリには、例外フィルターや式を含むメンバーなど、より多くの機能があります。

31
i3arnon

C#6.0のほとんどの新機能と同様に、null条件演算子は、使用されている変数がnullでない場合にメンバーの値を取得するパターンの単なる省略形(呼び出したい場合は構文糖)です。 。

タイプsstringを指定すると、次のようになります。

int? l = s?.Length;

に翻訳されます:

int? l = s == null ? null : s.Length;

また、null合体演算子??)と組み合わせることができます。

int l = s?.Length ?? 0;

文字列補間もstring.Formatの省略形として始まりましたが、stringまたはIFormatbleを生成できるパターンに発展しました。詳細は current spec を参照してください。

ちなみに、roslynは、言語やその機能ではなく、コンパイラプラットフォームのコード名です。

10
Paulo Morgado

Elvisオペレーターは、R​​aisePropertyChangedイベントを呼び出すときに非常に役立ちます。

過去には次のように書きます

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}

ただし、呼び出される前にPropertyChangedがnullに設定されていると、マルチスレッドの問題が発生する可能性がありました。代わりに次のように書くことができます:

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));

これにより、マルチスレッドの問題が完全に回避されます。つまり、構文の問題ではありません。

2
Peter