답변:
그것은이다 널 (null) 조건 연산자. 기본적으로 다음을 의미합니다.
"첫 번째 피연산자를 평가합니다. null 인 경우 중지하고 결과는 null입니다. 그렇지 않으면 두 번째 피연산자를 평가하십시오 (첫 번째 피연산자의 구성원 액세스 권한으로)."
당신의 예에서, 포인트가있는 경우이다 a
이고 null
, 다음 a?.PropertyOfA
으로 평가됩니다 null
예외를 던지는 것이 아니라 - 그것은 그 비교합니다 null
와 참조 foo
(문자열의 사용 ==
과부하)가 동일하지 않은 찾아 실행은 본문에 갈 것 if
문 .
다시 말해, 다음과 같습니다 :
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... 단 a
한 번만 평가됩니다.
이렇게하면 표현식의 유형도 변경 될 수 있습니다. 예를 들어을 고려하십시오 FileInfo.Length
. 이것은 type의 속성 long
이지만 null 조건부 연산자와 함께 사용하면 type 식으로 끝납니다 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";
합니다 ( ?? 또는 널 유착 연산자 댄 다르다 ? 또는 널 조건 연산자 ).
또한 Action을 사용하여 할당 연산자 외부에서 사용할 수도 있습니다. 대신에
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");
}
}
결과:
시험 2
|| Model.Model2.Model3.Model4.Name == null
하는 경우가 그렇지 않은 경우에, 같은 논리를 가지고 Model.Model2.Model3.Model4.Name
있다 null
, mapped.Name
남아있을 것입니다null
Model.Model2.Model3.Model4.Name
입니다 null
.
else
-branch 로 뛰어 들어 있고 가지고 mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null
있고, 두번째 예제는 대신 할 mapped.Name = "N/A"
것이다.
이것은 C #에 상대적으로 새로운 방법이므로 메서드 체인에서 null 또는 null이 아닌 값 과 관련하여 함수를 쉽게 호출 할 수 있습니다 .
같은 것을 달성하는 오래된 방법은 다음과 같습니다.
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
이제는 다음과 같이 훨씬 쉬워졌습니다.
member?.someFunction(var someParam);
나는 당신이 여기를 읽을 것을 강력히 권장합니다 :