2010-04-23 3 views
15

?은 C#에서 무엇을 의미하는지 궁금합니다.
나는 DateTime? 또는 int?과 같은 것을보고 있습니다. 이 C# 4.0 특정 있습니까?
나는이 물건의 이름을 모르기 때문에 Google에서 찾을 수 없습니다.
문제는 DateTime을 사용하고 있는데 캐스팅 오류가 많습니다 (DateTime에서 DateTime?까지). C# - 기본 질문 : '무엇입니까?'?

+9

;에

int max = x > y ? x : y 

은 동일합니다 .NET 2.0 이후로 계속되었습니다. – Randolpho

+0

전통적인 C if-then-else 연산자와 혼동하지 마십시오. x <0? "-": "+" – Qwertie

답변

33

그것은 Nullable<int> 또는 Nullable<DateTime> 작성을위한 속기입니다 감사합니다. Nullables은 null이 될 수없는 value types과 함께 사용됩니다 (항상 값을가집니다).

그건 그렇고 C# 4에만 국한되지 않습니다.

당신은 단지 intint?을 할당 할 수는 값이있는 경우, 그래서 당신의 코드가 같은 것을해야 할 것 : 또한 Nullable이 두 가지 속성, HasValueValue을 가지고 있습니다

int? n = 1; 
int i = n ?? default(int); //or whatever makes sense 

을 당신 값이 설정되면 테스트를 사용하고 실제 값을 가져올 수 있습니다.

+3

int i = n ?? 디폴트 (int); –

+0

@Brian Gideon, 네 말이 맞다. Nullable이이 두 속성을 가지고 있다는 것을 설명하기를 원했다. –

+0

@klausbyskov : 그 속성들을 지적하는 것은 좋지만, 그것들이 좋지 않은 선택을 한 예를 들어 주었을 것입니다 - 어쩌면 여러분은 그것들을 별도로 적어두고'int'에 대입하기 위해'?? '를 사용할 수 있습니다 . –

12

의미는 nullable type입니다.

int 및 DateTime과 같은 값 형식에 null 값을 할당 할 수 있습니다. 그것은 데이터베이스의 선택적 필드와 같은 것들에 매우 유용합니다.

5

?은 널 값 유형이기 때문에 C#으로하고있다.

const int DefaultValue = -1; 

// get a result that may be an integer, or may be null 
int? myval = GetOptionalIdFromDB(); 

// the value after ?? is used if myval is null 
int nonNullable = myval ?? DefaultValue; 

Null 허용 유형이 널 (null)과 비교 될 수 있으므로 위의 대한 속기 :

당신은 값 형식으로 혼합하는 ?? 연산자를 사용할 수

if(myval != null) { 
    nonNullable = myval.Value; 
} else { 
    nonNullable = DefaultValue; 
} 

하지만 선호 ??

1

[편집 : 분명히 이것은 때로는 발생합니다]

// nullable type properties may not initialize as null 
private int? foo; // foo = 0 

// to be certain, tell them to be null 
private int? foo = null; 
+0

그건 내 경험이 아니야. 메인 메쏘드와 모든 것을 가지고 완전한 레트로를 게시 할 수 있니? 이렇게 : 정적 클래스 프로그램 { private static int? 나는; public static void Main() { Console.WriteLine (i); } } –

+0

실제로, 맞습니다 ... 스 니펫 컴파일러에서 곧장 테스트를 수행하면 null로 초기화됩니다. 페이지 코드 숨김에 코드를 작성하고 다른 공개 봉인 된 클래스에서 속성에 액세스하면 값 유형 기본값으로 초기화되는 것을 보았습니다. 나는 언제/왜 그런 일이 일어나는지 더 깊게 파헤쳐 야 할 것입니다. -1 자신부터! – Matt

1

일반 클래스 Nullable<T>의 구현을 선언하는 간단한 방법입니다. 여기서 T는 null을 사용할 수없는 값 유형입니다.

그래서

int? i = null; 

Nullable<T> 위에서 언급 한 i이 작업을 시작하기 전에 값이 있는지 확인할 수 있도록 HasValue 속성을 노출로
Nullable<int> i = null; 

과 동일합니다.

주목할만한 점 : 객체에 Nullable<int> i = 3;을 캐스팅하면 상자에 넣기 전에 값이 있었기 때문에 int 또는 Nullable<int>으로 캐스팅 할 수 있습니다. 그러나 객체에 Nullable<int> i = null;을 캐스트하면 int로 캐스팅 할 때 NullReferenceException이 발생하지만 Nullable<int>으로 다시 캐스트 할 수 있습니다.

1

다른 사람들이 말했듯이 유형 이름 뒤에는 null 입력 가능 유형을 의미합니다.

? 조건 연산자에서도 사용됩니다. 그것은 새로운 아니다

int max; 
if(x > y) 
{ 
    max = x; 
} 
else 
{ 
    max = y; 
}