Нуль-условный оператор и строчная интерполяция в С# 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));

Это полностью исключает проблему многопоточности - так что это не совсем синтаксический сахар.