Оператор и интерполяции строк в C# 6
сделать оператор и интерполируемой строки синтаксис разрешить только синтаксический сахар?
оператор null-conditional (?.
), что позволяет очистить код за счет уменьшения "чрезмерного" null
проверка, и интерполированные строки (("{X}, {Y}")
), который объединяет Аргументы и формат в один, являются новыми функциями в C# 6.
компилируются ли они для своих нежелательных аналогов (т. е. уродливый код мы стремились избежать)?
Я прошу прощения за наивный вопрос, у меня нет лучшего понимания языков в целом, но мне любопытно, можно ли запустить эти функции, скажем, на C# 5.
Я знаю, что это так с Java в некоторых случаях, это правда, а также с этими примерами?
3 ответов
нет общего правила, оно отличается. Некоторые функции просто синтаксический сахар, некоторые добавляют возможности, которые не были возможны раньше, а некоторые являются комбинацией обоих.
Синтаксический Сахар
-
интерполяция строк-это:
string result = $"{bar}";
вместо:
string result = string.Format("{0}", bar);
-
распространения null оператор (
?.
) - это: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-conditional-это просто стенография (синтаксический сахар, если вы хотите его назвать) для шаблона получения значения члена, если экземпляр используемой переменной не равен null.
дали s
типа string
это:
int? l = s?.Length;
переведена на:
int? l = s == null ? null : s.Length;
и его можно совместить с оператор объединения null (??
):
int l = s?.Length ?? 0;
строка интерполяция также началась как стенография для string.Format
но развился до шаблона, который может либо произвести string
или IFormatble
. Пожалуйста, обратитесь к текущая спецификация для получения дополнительной информации.
и, кстати, Рослин - это кодовое имя для платформы компилятора, а не языки или их функции.
оператор Elvis очень полезен при вызове события RaisePropertyChanged.
в прошлом вы бы написать
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}
но была потенциальная проблема с несколькими потоками, если PropertyChanged было установлено значение null до его вызова. Вместо этого, вы можете написать:
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));
что полностью исключает проблему многопоточности-так что это не совсем синтаксический сахар.