Co oznacza znak zapytania i operator kropki. mean w C # 6.0?

W C # 6.0 w VS2015 preview mamy nowego operatora, ?., które można użyć w ten sposób:

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

Co dokładnie robi?

Author: Marcos Dimitrio, 2015-02-05

3 answers

To null conditional centrala. Zasadniczo oznacza:

"Oceń pierwszy operand; jeśli to jest null, stop, z wynikiem null. W przeciwnym razie Oceń drugi operand (jako dostęp członka pierwszego operandu)."

W twoim przykładzie chodzi o to, że jeśli a jest null, to a?.PropertyOfA będzie oceniać na null zamiast rzucać wyjątek - porównuje to odniesienie null z foo (używając przeciążenia ==), stwierdzi, że nie jest equal i wykonanie trafią do ciała if instrukcji.

Innymi słowy, jest tak:

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

... z tą różnicą, że a jest oceniana tylko raz.

Zauważ, że może to również zmienić typ wyrażenia. Na przykład rozważ FileInfo.Length. Jest to właściwość typu long, ale jeśli użyjesz jej z operatorem warunkowym null, skończysz z wyrażeniem typu long?:

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
 284
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 16:01:09

Może być bardzo przydatny podczas spłaszczania hierarchii i / lub mapowania obiektów. Zamiast:

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;
}

Może być napisane tak (ta sama logika jak powyżej)

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

DotNetFiddle.Net Przykład Roboczy .

(the ?? czy operator null-koalescencyjny jest inny niż ? lub null operator warunkowy ).

Może być również używany poza operatorami przypisania z akcją. Zamiast

Action<TValue> myAction = null;

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

Można uprościć do:

myAction?.Invoke(TValue);

Przykład DotNetFiddle :

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");
  }
}

Wynik:

Test 2

 38
Author: Erik Philips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 23:14:50

Jest to stosunkowo nowość w C#, co ułatwia nam wywoływanie funkcji w odniesieniu do wartości null lub non-null w łańcuchowaniu metod.

Starym sposobem na osiągnięcie tego samego było:

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

A teraz stało się to znacznie łatwiejsze dzięki just:

member?.someFunction(var someParam);

Gorąco polecam przeczytać go tutaj:

Https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

 1
Author: Zeeshan Adil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 06:11:40