수색…


통사론

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

.NET Fiddle에서의 라이브 데모

이것은 논리적으로 다음과 같습니다.

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;

outputint? 형이 될 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 ) );


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow