Что означает знак вопроса и оператор точки. значит в C# 6.0?



С C# 6.0 в предварительном просмотре VS2015 у нас есть новый оператор,?., который может быть использован такой:



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

...

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


что именно он делает?

946   3  

3 ответов:

это null условное оператора. Это в основном означает:

"вычислите первый операнд; если это null, остановитесь, с результатом null. В противном случае вычислите второй операнд (как доступ к члену первого операнда)."

в вашем примере, дело в том, что если a и null, потом a?.PropertyOfA будет оценено как null вместо того, чтобы бросать исключение - он будет сравнивать, что null ссылки foo (используя строку == перегрузка), найти их не равны и выполнение будет идти в тело if заявление.

другими словами, это так:

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

... за исключением того, что a оценивается только один раз.

обратите внимание, что это также может изменить тип выражения. Рассмотрим, например,FileInfo.Length. Это свойство типа long, но если вы используете его с нулевым условным оператором, вы получите выражение типа long?:

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

Это может быть очень полезно при выравнивании иерархии и / или отображения объектов. Вместо:

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

Это может быть написано как (та же логика, что и выше)

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

DotNetFiddle.Net Рабочий Пример.

(the ?? или нуль-коалесцирующий оператор отличается от ? или нулевой условный оператор).

его можно также использовать вне стороны операторов присваивания с действием. Вместо из

Action<TValue> myAction = null;

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

его можно упростить до:

myAction?.Invoke(TValue);

DotNetFiddle Пример:

использование системы;

public class Program
{
  public static void Main()
  {
    Action<string> consoleWrite = null;

    consoleWrite?.Invoke("Test 1");

    consoleWrite = (s) => Console.WriteLine(s);

    consoleWrite?.Invoke("Test 2");
  }
}

результат:

Это относительно новое для C#, что позволяет нам легко вызывать функции относительно null или non-null значения в цепочке методов.

старый способ добиться того же самого был:

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

и теперь это стало намного легче с:

member?.someFunction(var someParam);

я настоятельно рекомендую вам прочитать его здесь:

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

Comments

    Ничего не найдено.