Нуль-условный оператор и строчная интерполяция в С# 6
Сделайте оператор с нулевым условием и интерполированные строки синтаксис решить только синтаксический сахар?
Оператор с нулевым условием (?.
), который позволяет очищать код путем уменьшения "чрезмерной" проверки null
, а интерполированные строки (("\{X}, \{Y}")
), которые привносят аргументы и формат в один, являются новыми функции на С# 6.
Скомпилируются ли они с их нежелательными коллегами (т.е. уродливым кодом, которого мы старались избегать)?
Извиняюсь за наивный вопрос, у меня нет лучшего понимания языков вообще, но мне любопытно, можно ли запускать эти функции, скажем, на С# 5.
Я знаю, что это случай с Java в некоторых случаях, верно ли это также с этими примерами?
Ответы
Ответ 1
Нет общего правила, оно отличается. Некоторые функции - это просто синтаксический сахар, некоторые добавляют возможности, которые раньше не были возможны, а некоторые из них являются комбинацией обоих.
Синтаксический сахар
-
Строковая интерполяция - это:
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
blocks:
try
{
}
catch
{
await Task.Delay(1000);
}
Конечно, в обеих категориях есть больше функций, таких как фильтры исключений и элементы с выраженным выражением.
Ответ 2
Как и большинство новых функций в С# 6.0, оператор с нулевым условием является просто сокращенным (синтаксический сахар, если вы хотите его называть) для шаблона получения значения члена, если экземпляр используемой переменной не является нулевым.
Учитывая s
типа string
, это:
int? l = s?.Length;
преобразуется в:
int? l = s == null ? null : s.Length;
И его можно комбинировать с оператором нулевого коалесцирования (??
):
int l = s?.Length ?? 0;
Интерполяция строк также начиналась как сокращение для string.Format
, но эволюционировала к шаблону, который может либо генерировать string
, либо IFormatble
. Для получения дополнительной информации см. текущая спецификация.
И, кстати, roslyn - это кодовое имя для платформы компилятора, а не языки или их функции.
Ответ 3
Оператор Elvis очень полезен при вызове события RaisePropertyChanged.
В прошлом вы пишете
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}
Но существовала потенциальная проблема многопоточности, если для свойства PropertyChanged было установлено значение null до ее вызова. Вместо этого вы можете написать:
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));
Это полностью исключает проблему многопоточности - так что это не совсем синтаксический сахар.