2010-04-13 4 views
30

나는 ... 반복되어 많은 인터뷰에서 다음과 같은 질문을 ....하지만 여전히 간단한 예제를 설명 할 수있다언제 C#에서 null 입력 가능 유형을 사용해야합니까?

  1. C#에서 nullable 형식은 무엇입니까?
  2. C#에서 null 입력 가능 유형을 사용해야하는시기는 언제입니까?
  3. 간단한 예를 들려 줄 수 있습니까?

의견이 있으십니까?

+1

가능한 복제본은 http://stackoverflow.com/questions/1550909/coding-practices-for-c-nullable-type – Ether

답변

30

당신이 nullable 형식을 사용할 수있는 경우에 대한 예를 들어

Using Nullable Types (C# Programming Guide)에서 바라 일반 부울 변수가 두 값을 가질 수있는 방법을 고려한다. "undefined"를 나타내는 값이 없습니다. 많은 프로그래밍 응용 프로그램에서 대부분 데이터베이스 상호 작용 변수는 정의되지 않은 상태에 존재할 수 있습니다. 예를 들어 데이터베이스의 필드에는 true 또는 false 값이 포함될 수 있지만 값은 전혀 포함되지 않을 수 있습니다. 마찬가지로 참조 형식을 null로 설정하여 이 초기화되지 않았 음을 나타낼 수 있습니다.

+0

이지만 모든 참조 (예 : 개체)는 null 일 수 있습니다. 그래서'Nullable'에서'bool'을 boxing하는 것은 왜'Boolean'으로 상자에 넣지 않을까요? 왜 아직도 궁금합니다. –

17

Null은 "값 없음"또는 "데이터 없음"을 의미합니다. 당신이 사용하거나 사용하고있는 시스템의 컨텍스트에서 "값이 없음"이 유효한 값이면 null 가능 유형을 사용합니다. 이 경우

int? weightOfCargo = TryGetTruckCargoWeight() 

는 널 타입 TryGetTruckCargoWeight는()는 null 것을 나타낸다. 이것의 의미는 일반적으로 데이터를 사용할 수 없다는 것입니다 (어쩌면 트럭이 없거나 무게가 측정되지 않았을 수도 있습니다). true와 false :

9

예를 들어 다음과 같은 고려 :

도구는 UI를 통해 지정된 설정이 있습니다. 그러나이 도구는 명령 줄에서 실행할 수도 있으며 UI에 지정된 설정은 명령 줄을 통해 무시할 수 있습니다. 그래서 코드는 다음과 같다 :

bool? setting1; 

... 프로세스 명령 줄에서 지정된 설정을하는 경우 수행

나중에
setting1.Value = setting; 

...

if(setting1.HasValue) 
    ui.setting1 = setting1.Value 
4

이 지정된 값을 사용 할 때마다 null 값을 나타 내기 위해 :
* 값을 나타내지 않는 DateTime minimumvalue
* -1 r 정수
다음 Nullable 형식 더 나은 선택이 될 것입니다.

1
// to replace 
// if(foo.Id > 0) 
if(foo.Id.HasValue) 
{ 
    Update(foo); 
} 
else 
{ 
    Insert(foo); 
} 
4

우리 모두가 C#을

에 refrence 유형 •의 두 가지 종류가 있습니다 알고

참조 유형이 존재하지 않는 값 (NULL)하지만 Vaue 형식으로 표현 될 수있는 값 종류, 그러나 수 없습니다 NULL 값을 나타냅니다. 예를 들어

문자열 이후
참조 유형은 null를

String s=null; //ok

를 선언 할 수 있지만이 같은 INT32로 값 유형을 선언하려고하면이 produceses 컴파일러 오류를 null하는 것입니다

Int32 i=null; // compiler error

값 형식에서 null을 나타내려면 Nullable 형식이라는 특수 구문을 사용해야합니다. 그것은? 상징. nullable 형식을 사용 commanly

Int32? I=null; //now its ok

이제 시나리오는 CALSS이 널 열이있는 테이블로 맵 데이터베이스 프로그래밍에 있습니다.
• 열이 (전자 메일 주소 및 고객 주소)와 같은 String 유형의 참조 유형 인 경우 C#
에서 null로 정의 할 수 있으므로 문제가 없습니다. • 그러나 열이 두 배인 값 유형 인 경우 as (고객 계정 잔액)으로, nullable 형식을 사용하지 않고 C#에 매핑 할 수 없습니다. 데이터베이스에서 고객 테이블 예컨대
// 맵


public class Customer 
{ 
    ... 
    public decimal? AccountBalance; 
} 
+9

@Vijay : string은 참조 유형입니다. 가치 유형이 아님 – Jehof

+0

작은 수정 : 실제로는 3 가지 유형이 있습니다. 포인터 유형은 어떻습니까? :) http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx –

+0

@Jehof : 명백한 오자를 지적 해 주셔서 감사합니다. –

2

C#을 데이터 형식의 두 가지 유형이 있습니다. 값 유형 및 참조 유형. 문자열은 참조 유형이고 int는 값 유형입니다. 참조 유형은 string s = null;과 같이 널 값으로 지정 될 수 있습니다. 그러나 널 값을 정수에 직접 할당 할 수는 없습니다. like int a = null // 값 유형이 널 (NULL) 값을 허용하도록하려면 널 (null) 입력이 사용됩니다. 이 Null을 허용하기 위해, ?

? a = null;//ok. 
1

에 추가하여 데이터베이스 테이블가에 널 (NULL) 열을 포함 할 때 우리는 실제 시나리오에 대해 이야기하면 나는 생각하고 당신은 DB 엔티티 매핑 등의 DTO (데이터 전송 개체)를 작성해야 . 이러한 시나리오에서는 엔티티 클래스에서 정확히 동일한 데이터 유형 매핑을 가져와야합니다. 이러한 요구 사항을 달성하기 위해 nullable 유형은 정확히 동일한 매핑을 작성하고 사용자가이 시나리오에서 쉽게 작업 할 수있게 해줍니다.

감사합니다.

3

하나 더 예 :

상상, 당신은 당신의 BLL에 GetArticles 방법을 만들어야합니다. 이 메서드는 날짜 기간 (fromto 인수), 검색 문자열 (search 인수) 및 문서 범주 (categoryId 인수)와 같은 인수를 취해야합니다. 이 모든 인수는 선택 사항입니다. 따라서 어떤 경우에는 fromsearch 인수 만 정의하고 다른 인수는 categoryId뿐입니다.

이렇게하려면 필요한 인수 조합을 사용하여 GetArticles 메서드에 많은 오버로드를 만들 수 있습니다.다른 방법은이 경우에만 하나의 방법 GetArticles(DateTime? from, DateTime? to, string search, int? categoryId)을 정의하는 것입니다. 이 경우 인수가 null이면 건너 뜁니다.

내가 .NET 4.0이라는 새로운 기능에 대해 알고있는 이유는 optional parameters and named arguments이지만 그 전에는 멋진 해결 방법이었습니다.