18

Do the null-conditional operator and interpolated strings syntax resolve to just syntactic sugar?

The null-conditional operator (?.), which allows code clean-up through reducing "excessive" null checking, and interpolated strings (("\{X}, \{Y}")), which brings the arguments and format into one, are new features in C# 6.

Do these get compiled to their undesirable counterparts (i.e. the ugly code we sought to avoid)?

I apologize for the naïve question, I don't have the best understanding of languages in general, but I'm curious if it would be possible to run these features on, say, C# 5.

I know this is the case with Java in some instances, is it true as well with these examples?

6
  • 2
    Elvis operator is something else. It's actually a Null coalescing operator, which picks the first non-null value. ?. is trying to traverse the object down the property chain, it returns non-null only if the whole chain evaluation succeeded. en.wikipedia.org/wiki/Null_coalescing_operator UPDATE - found a name for ?., it's called Safe Navigation Operator. Commented Dec 15, 2014 at 21:38
  • C# already has the ?? operator. Is that not the same thing? Commented Dec 15, 2014 at 21:40
  • 4
    As an update to future readers, the "Elvis operator" has been officially named the "null-conditional operator" in C# 6.0 Commented Jan 16, 2015 at 17:42
  • 6
    I like Elvis operator better :) Commented Nov 5, 2015 at 19:28
  • 1
    Who cares what your code is compiled into? The only considerations you should have are 1) what is the most concise and clear way I can express an algorithm and 2) how fast and reliable is the result of the compilation. You realize that GOTO is used extensively in IL, right? GOTO. Imagine all your clean, elegant code reduced to a bunch of lousy GOTO statements. Now go shower. Commented Jun 30, 2016 at 14:46

3 Answers 3

32

There isn't a general rule, it differs. Some features are simply syntactic sugar, some add capabilities that weren't possible before, and some are a combination of both.

Syntactic Sugar

  • String interpolation - This:

    string result = $"{bar}";
    

    Instead of:

    string result = string.Format("{0}", bar);
    
  • Null-propagating operator (?.) - This:

    var result = Foo()?.Length
    

    Instead of:

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

New Capabilities

  • String interpolation - Also adds support for IFormattable using FormattedString so this is possible:

    IFormattable result =  $"{bar}"
    
  • Await in catch/finally - It's now possible to use await in catch and finally blocks:

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

There are of course more features in both categories, like exception filters and expression-bodied members.

Sign up to request clarification or add additional context in comments.

6 Comments

So maybe the general rule for programmers is to either have a thorough understanding of the behaviors of these features or default to the version they're implemented.
@ChiefTwoPencils that's reasonable.
@ChiefTwoPencils those are different operators with different purpose. ?? is the null coalescing operator. ?. is the null conditional operator (or safe navigation operator)
1. var result = GetString() ?? string.Empty; 2. var result = GetString()?.Length
@PauloMorgado of course. That's why it was already available in IL.
|
11

Like most of the new features in C#6.0, the null-conditional operator is just shorthand (syntactic sugar, if you want to call it) for a pattern of getting the value of a member if the instance the variable being used is not null.

Given a s of type string, this:

int? l = s?.Length;

is translated into:

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

And it can be combined with the null coalescing operator (??):

int l = s?.Length ?? 0;

String interpolation also started as shorthand for string.Format but evolved to a pattern that can either produce a string or an IFormatble. Please, refer to the current spec for more information.

And, by the way, roslyn is the code name for the compiler platform, not the languages or their features.

2 Comments

Yes, roslyn is the name for the compiler platform. I asked about the code these features were compiled to, someone edited the post and added the tag, seemed appropriate/reasonable to me. A distinction/clarification between your claims and the accepted answer would be great. Thanks for the link; I currently don't have the time to do spec reading hence asking here, but will dive in soon.
@ChiefTwoPencils, the link I posted is for the spec of the string interpolation - fairly short. As for the "Elvis" operator, unless you want to spend a month or two going through all the discussions, it's pretty much what I posted.
2

The Elvis operator is very useful when calling the RaisePropertyChanged event.

In the past you would write

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

But there was a potential multi threading issue if PropertyChanged was set to null before it was invoked. Instead you can write:

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

Which completely avoids the multi threading issue - so it's not quite Syntax sugar.

4 Comments

minor note: "in the past" nameof() did not exist. it entered the language together with the null-conditional operator. also, the race condition was resolved by extracting both references to a local variable. so you "only" save a few keystrokes (which is not necessarily something to be scoffed at)
even smaller note: Null-propagating operator is the ?. which you are referring to above as the Elvis operator which is the ?: which does indeed look like Elvis.
No, it does not avoid multi threading issues, they are just shifted slightly. See stackoverflow.com/a/35786442/1671066.
@MichaWiedenmann, MSDN: msdn.microsoft.com/en-us/library/dn986595.aspx says otherwise.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.