null-conditional operator および interpolated strings 構文は syntactic sugar に解決されますか?
ヌル条件演算子(?.
)を使用すると、「過剰」なnull
チェックと、補間された文字列(("\{X}, \{Y}")
)は、引数とフォーマットを1つにまとめたもので、C#6の新機能です。
これらは望ましくない対応物(つまり、回避しようとした醜いコード)にコンパイルされますか?
私はナイーブな質問をお詫び申し上げます。一般に言語を最もよく理解していませんが、これらの機能をC#5などで実行できるかどうか知りたいです。
これはJavaの場合に当てはまることですが、これらの例にも当てはまりますか?
一般的なルールはありません、それは異なります。いくつかの機能は単に構文上の砂糖であり、いくつかは以前は不可能であった機能を追加し、いくつかは両方の組み合わせです。
文字列補間-これ:
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);
}
もちろん、両方のカテゴリには、例外フィルターや式を含むメンバーなど、より多くの機能があります。
C#6.0のほとんどの新機能と同様に、null条件演算子は、使用されている変数がnullでない場合にメンバーの値を取得するパターンの単なる省略形(呼び出したい場合は構文糖)です。 。
タイプs
のstring
を指定すると、次のようになります。
int? l = s?.Length;
に翻訳されます:
int? l = s == null ? null : s.Length;
また、null合体演算子(??
)と組み合わせることができます。
int l = s?.Length ?? 0;
文字列補間もstring.Format
の省略形として始まりましたが、string
またはIFormatble
を生成できるパターンに発展しました。詳細は current spec を参照してください。
ちなみに、roslynは、言語やその機能ではなく、コンパイラプラットフォームのコード名です。
Elvisオペレーターは、RaisePropertyChangedイベントを呼び出すときに非常に役立ちます。
過去には次のように書きます
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}
ただし、呼び出される前にPropertyChangedがnullに設定されていると、マルチスレッドの問題が発生する可能性がありました。代わりに次のように書くことができます:
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));
これにより、マルチスレッドの問題が完全に回避されます。つまり、構文の問題ではありません。