Что означает знак вопроса и оператор точки. значит в 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
}
что именно он делает?
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);использование системы;
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);я настоятельно рекомендую вам прочитать его здесь:
Comments