What does question mark and dot operator ?. mean in C# 6.0?

What does question mark and dot operator ?. mean in C# 6.0?

Its the null conditional operator. It basically means:

Evaluate the first operand; if thats null, stop, with a result of null. Otherwise, evaluate the second operand (as a member access of the first operand).

In your example, the point is that if a is null, then a?.PropertyOfA will evaluate to null rather than throwing an exception – it will then compare that null reference with foo (using strings == overload), find theyre not equal and execution will go into the body of the if statement.

In other words, its like this:

string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}

… except that a is only evaluated once.

Note that this can change the type of the expression, too. For example, consider FileInfo.Length. Thats a property of type long, but if you use it with the null conditional operator, you end up with an expression of type long?:

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null

It can be very useful when flattening a hierarchy and/or mapping objects. Instead of:

if (Model.Model2 == null
  || Model.Model2.Model3 == null
  || Model.Model2.Model3.Model4 == null
  || Model.Model2.Model3.Model4.Name == null)
{
  mapped.Name = N/A
}
else
{
  mapped.Name = Model.Model2.Model3.Model4.Name;
}

It can be written like (same logic as above)

mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? N/A;

DotNetFiddle.Net Working Example.

(the ?? or null-coalescing operator is different than the ? or null conditional operator).

It can also be used out side of assignment operators with Action. Instead of

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

It can be simplified to:

myAction?.Invoke(TValue);

DotNetFiddle Example:

using System;

public class Program
{
  public static void Main()
  {
    Action<string> consoleWrite = null;
    
    consoleWrite?.Invoke(Test 1);
    
    consoleWrite = (s) => Console.WriteLine(s);
    
    consoleWrite?.Invoke(Test 2);
  }
}

Result:

Test 2

Basically, I have applied ?. operator after Model as well. I am trying to know that whether it can be applied directly to the model or does it only work with the navigation properties?

The ? or null conditional operator operators on the left value, regardless of the type of value. And the compiler doesnt care what the value is on the right. Its simple compiler magic (meaning it does something you can already do, just in a simplified why).

For example

  var a = model?.Value;

is the same as saying

  var a = model == null ? null : model.Value;

In the second case the evaluation of checking for null has no associate with the value returned. The null conditional operator basically just always return null if the left value is null.

The type of member (Method, Field, Property, Constructor) .Value is irrelevant.

The reason your DotNetFiddle example doesnt work is because the compiler being use for the .Net 4.7.2 isnt compatible with the c# version that support the null conditional operator. Changing it to .Net 5, works:

https://dotnetfiddle.net/7EWoO5

What does question mark and dot operator ?. mean in C# 6.0?

This is relatively new to C# which makes it easy for us to call the functions with respect to the null or non-null values in method chaining.

old way to achieve the same thing was:

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

and now it has been made much easier with just:

member?.someFunction(var someParam);

I strongly recommend this doc page.

Leave a Reply

Your email address will not be published.