2012-03-26 16 views
0

C# 4에서 ?? 연산자를 사용하여 흥미로운 기능을 발견했습니다.C# 연산자`?? '는 어떻게 작동합니까?

관계없이 은 (searchForObject이 NOT NULL 개체를 반환 searchForObject() 반환 값의 이미 null 경우 코드 의이 줄은 항상 그것이 LINQ 문을하지 않는 기능이며, 사실, existingObject에 null을 할당

다음 if 문

existingObject = extstingObject ?? searchForObject(); 

사람이 이유를 설명 할 수 : 구조는 다음 existingObject이 NOT NULL 객체를 할당 할 경우) 간단한로 대체 할 것인가? 여기

는 MSDN에 a link, 그것은 말한다

널 (NULL) 유형 값을 포함 할 수 있거나,이 정의 될 수있다. The ?? 연산자는 Nullable 유형 이 Null을 허용하지 않는 유형에 할당 될 때 반환 될 기본값을 정의합니다. ?? nullable 값 형식을 사용하지 않고 nullable 값 형식에 할당하려고하면 ?? 연산자, 컴파일 타임 오류가 발생합니다. 캐스트를 사용하고 nullable 값 형식이 현재 정의되지 않은 경우 InvalidOperationException 예외가 발생합니다.

Null 허용 유형을 null이 허용되지 않는 유형에 할당하는 부분은 예상 한 것과 다릅니다.

문제 비주얼 스튜디오 디버거에서 로컬 변수의 초기화를 지연 하였다 2010

+9

분명히 'searchForObject' 메소드는 null을 반환합니다. –

+3

Typo가 있습니까 ?? – Jon

+0

아마도'searchForObject()'가 항상 null을 반환하기 때문에/ – Aliostad

답변

1

:

당신이 실제로 실행하고 동일한 코드 보고하지 않을 가능성도 있습니다. 때때로 Visual Studio에서 발생합니다. 프로젝트를 다시 빌드, bin 폴더를 삭제하려고, 일부 Debug.WriteLine의에서 정말 앱에서 무슨 일이 일어나고 있는지 추적하기 위해 넣어 등 또 다른 질문이 마음에 오는

(대신 에 의존 IDE의 Watch) - 할당 후 existingObject이 실제로 null입니까? :) 당신은 어떻게 주장 했습니까?

뭔가 다른 일이 일어나고가있다

Surprising CLR/JIT? behaviour - deferred initialization of a local variable

3

?? 따라서

if (somethingisnull) 
    somethingisnull = somethingnotnull 

searchForObject() 속기뿐만 아니라 널

+0

사실이 구문을 사용하면 값을 얻습니다. – BanditoBunny

+0

어떤 유형이 existingObject이고 어떤 유형이 searchForObject가 반환합니까? – Jon

+0

동일한 유형, 사용자 정의 클래스. – BanditoBunny

0

반환해야이며 이유는 다른 곳에서 잘못입니다. 이 코드 라인에서 searchForObject()의 리턴 값 경우 existingObject가 null existingObject에 할당한다.

2

?? 피연산자가 null이 아니면 왼쪽 피연산자를 반환합니다. 그렇지 않으면 오른쪽 피연산자를 반환합니다.

// ?? operator example. 
    int? x = null; 
    // y = x, unless x is null, in which case y = -1. 
    int y = x ?? -1; 
+0

예, 이것은 msdn의 예입니다. 무효화 할 수없는 형식에 nullable 형식을 할당하는 데 사용됩니다. – BanditoBunny

+0

어디에서이 작업을 수행하고 있습니까? – Habib

+0

Null을 허용하지 않는 유형에는 null을 할당 할 수 없습니다. – Habib

2

읽기 : Coalescing operator - ?? : 합체 연산자 new 연산자는 C# 2.0에 추가됩니다. 병합 연산자는 ??라고도합니다.

?? 로 교체 할 수 연산자

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a==null ? b.Value : a; 

?아래

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a ?? b.Value; 

??처럼 oeprate은 첫 번째가 null의 경우 두 번째 값을 할당 할 수 있습니다 귀하의 경우 너무

existingObject = extstingObject ?? searchForObject(); 

searchForObject()의 값을 얻을에 할당 그쪽 extstingObject가 null의 경우

두 번째 함수보다 null이 발생하는 경우에도 null을 반환합니다. 그렇다 나는이 의견에 말에서

0

, searchForObject()null을 반환해야합니다 :

내 질문에 봐 (과 답변)가 있습니다. 다음 예제를 살펴보십시오. 우리는 다음과 같이 간단하게이 문제를 테스트하는 경우 이제

object existingObject = null; 
existingObject = existingObject ?? searchForObject(); 

:

Console.Write("existingObject is "); 
if (existingObject == null) Console.WriteLine("null"); 
else Console.WriteLine("not null"); 

existingObject is not null라고 우리에게 이야기하는 것입니다 우리는이 작업을 수행 할 수 있습니다 searchForObject()의이 구현으로

object searchForObject() 
{ 
    return new object(); 
} 

.

object searchForObject() 
{ 
    return null; 
} 

existingObject is null라고 우리에게 이야기하는 것입니다 : 그러나, 우리는 이것에 searchForObject() 반환하는 내용을 변경합니다. 이 existingObject is not null 있음을 알려드립니다

object existingObject = new object(); 
existingObject = existingObject ?? searchForObject(); 

: 이제 마지막 테스트는 우리가 먼저 확인을하기 전에 existingObject의 값을 변경하는 것입니다.

existingObject이 null 인 경우, 이것은 ?? 뒤에 오는 것이 무엇이든 null을 반환한다는 것을 의미합니다.

관련 문제