C# Language
Null-Coalescing 연산자
수색…
통사론
- var result = possibleNullObject ?? 기본값;
매개 변수
매개 변수 | 세부 |
---|---|
possibleNullObject | null 값을 테스트 할 값입니다. null가 아닌 경우,이 값이 리턴됩니다. Nullable 유형이어야합니다. |
defaultValue | possibleNullObject 가 null의 경우에 돌려 주어지는 값 possibleNullObject 와 같은 유형이어야 possibleNullObject . |
비고
null 통합 연산자 자체는 두 개의 연속 된 물음표 문자입니다. ??
조건식의 줄임말입니다.
possibleNullObject != null ? possibleNullObject : defaultValue
왼쪽 피연산자 (테스트중인 객체)는 nullable 값 유형 또는 참조 유형이어야하며 그렇지 않으면 컴파일 오류가 발생합니다.
The ?? 연산자는 참조 유형과 값 유형 모두에서 작동합니다.
기본 사용법
null-coalescing operator (??)
사용하면 왼쪽 피연산자가 null
경우 nullable 형식의 기본값을 지정할 수 있습니다.
string testString = null;
Console.WriteLine("The specified string is - " + (testString ?? "not provided"));
이것은 논리적으로 다음과 같습니다.
string testString = null;
if (testString == null)
{
Console.WriteLine("The specified string is - not provided");
}
else
{
Console.WriteLine("The specified string is - " + testString);
}
또는 삼항 연산자 (? :) 연산자 사용 :
string testString = null;
Console.WriteLine("The specified string is - " + (testString == null ? "not provided" : testString));
Null 폴스 스루 및 연결
왼쪽 피연산자는 Nullable이어야하고 오른쪽 피연산자는 같거나 같아야합니다. 결과는 그에 따라 입력됩니다.
null 허용 불가
int? a = null;
int b = 3;
var output = a ?? b;
var type = output.GetType();
Console.WriteLine($"Output Type :{type}");
Console.WriteLine($"Output value :{output}");
산출:
형식 : System.Int32
값 : 3
Nullable
int? a = null;
int? b = null;
var output = a ?? b;
output
은 int?
형이 될 int?
b
와 동일, 또는 null
다중 병합
통합은 체인에서도 수행 할 수 있습니다.
int? a = null;
int? b = null;
int c = 3;
var output = a ?? b ?? c;
var type = output.GetType();
Console.WriteLine($"Type :{type}");
Console.WriteLine($"value :{output}");
산출:
형식 : System.Int32
값 : 3
Null 조건부 연결
null 병합 연산자는 null 전파 연산자 와 함께 사용하여 객체의 속성에 더 안전하게 액세스 할 수 있습니다.
object o = null;
var output = o?.ToString() ?? "Default Value";
산출:
형식 : System.String
값 : 기본값
메서드 호출로 연산자를 병합하는 null
null 통합 연산자를 사용하면 null
을 반환 할 수있는 메서드가 기본값으로 되돌아가는 지 쉽게 확인할 수 있습니다.
널 병합 연산자가 없으면 다음을 수행하십시오.
string name = GetName();
if (name == null)
name = "Unknown!";
널 통합 연산자 사용 :
string name = GetName() ?? "Unknown!";
기존 사용 또는 새 생성
이 기능이 실제로 도움이되는 일반적인 사용 시나리오는 컬렉션에서 개체를 찾고 이미 존재하지 않는 개체를 새로 만들어야 할 때입니다.
IEnumerable<MyClass> myList = GetMyList();
var item = myList.SingleOrDefault(x => x.Id == 2) ?? new MyClass { Id = 2 };
null 병합 연산자로 지연 등록 정보 초기화
private List<FooBar> _fooBars;
public List<FooBar> FooBars
{
get { return _fooBars ?? (_fooBars = new List<FooBar>()); }
}
속성 .FooBars
처음 액세스하면 _fooBars
변수가 null
평가되므로 할당 문으로 _fooBars
결과 값이 할당되고 평가됩니다.
스레드 안전성
이것은 스레드로부터 안전한 ( lazy) 속성 구현 방법이 아닙니다 . thread-safe laziness를 위해서, .NET Framework에 내장 된 Lazy<T>
클래스를 사용하십시오.
식체를 사용하는 C # 6 구문 설탕
C # 6부터이 구문은 속성에 대한 표현 본문을 사용하여 단순화 될 수 있습니다.
private List<FooBar> _fooBars;
public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );
속성에 대한 후속 액세스는 _fooBars
변수에 저장된 값을 생성합니다.
MVVM 패턴의 예
이것은 MVVM 패턴으로 명령을 구현할 때 자주 사용됩니다. 뷰 모델의 생성을 위해 명령을 열성적으로 초기화하는 대신 다음과 같이이 패턴을 사용하여 명령을 지연 초기화합니다.
private ICommand _actionCommand = null;
public ICommand ActionCommand =>
_actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );