2009-04-03 2 views
7

저는 항상 null을 표현하는 다양한 방법과 혼동합니다. null 참조 유형 (일명 "null")이 있습니다. 그런 다음 응용 프로그램에서 MinValue를 사용하여 개발자가 null을 나타내는 것을 보았습니다. 예 : "null"을 사용하는 String을 제외한 Double.MinValue 또는 DateTime.MinValueC#에서 NULL과의 혼동

그런 다음 System.DBNull (및 System.DBNull.Value - 사용할 때 무엇을 사용해야할지)이 있습니다. 혼란에 추가하려면 System.NullableSystem.Nullable<T> 네임 스페이스가 있습니다.

누군가이 null 혼란을 해결하는 데 도움을 줄 수 있습니까?

감사합니다.

답변

27

확실히.

는 데이터베이스에서 null 값을 나타내는 데 ADO.NET에서 사용 된 클래스입니다 (아직 사용되고 있습니다).

null 실제로 null 참조하고, 응용 프로그램 코드의 모든 참조 형은, 음, null 값으로 null을 사용해야합니다.

제네릭을 도입 한 C# 2.0 이전의 어두운 날에 다양한 기본 유형 (null을 할당 할 수없는 값 유형이므로)에 대한 사용은 MinValue입니다. 이제 null 입력 가능 기본 유형을 나타내는 데 선호되는 방법은 Nullable<T> 일반 유형을 사용하는 것입니다. 대개 원시 유형 다음에 물음표가있는 축약 형으로 표시됩니다.

Nullable<int> foo; 

또는

int? foo; 

은 모두 동일하다 : 예를 들어, 내가 같이 C#으로 foo라는 이름의 널 (NULL) int 변수를 선언 할 수있다.

+0

서식을 보내 주셔서 감사합니다. ;) –

+0

멋지게 완성 - 명확하고 유익한 – annakata

0

null 형식이 C# 2.0에서 돌아 오기 전에 "MinValue"이 값 형식과 함께 사용되었습니다. 따라서 값 유형에 값이없는 경우 이전 유형의 알기 스타일을 사용하는 많은 기존 코드가 있습니다. 요즘은 DateTime date = DateTime.MinValue보다 DateTime? date = null을 사용하는 것이 훨씬 쉽습니다. DBNull이가는 한, 그것은 데이터베이스의 추상화 계층으로 필요한 것이지만, NHibernate와 같은 ORM을 사용하여 직접 처리해야하는 것을 피할 수 있습니다. 개발의 관점에서는 내장 된 C# 유형 만 처리하면됩니다.

0

MinValue가 null이 아닙니다. MinValue입니다. nullable 값 유형이없는 C# 1.0을 사용하는 사람들은 "null"로 사용되기도합니다. 대신 Nullable, ot DateTime?을 사용해야합니다.

DBNull은 데이터베이스 ("DB"null)와 통신하는 데 사용되는 .NET 값입니다. NULL이라는 데이터베이스 개념은 .NET null 참조와 다른 것을 의미합니다. 데이터베이스 용어에서 NULL은 "알 수 없음"또는 "부재"를 의미합니다. 실제 널값

  • Null 허용 참조 형식

  • +0

    데이터베이스 용어의 DBNull은 C# 용어에서 null과 동일하다는 것을 의미하며, .Net 1.x가 나왔을 때 Generic이 버전 2에 도입되었으므로 null 가능 유형이 없음을 의미합니다. – Tracker1

    +0

    죄송합니다. 사실이 아닙니다. 관계형 데이터베이스의 NULL은 "알 수 없음"또는 "정보 없음"을 의미합니다. 두 번째 테이블에서 일치하는 행이없는 OUTER 조인을 생각해보십시오. 해당 테이블의 열은 NULL이 아니므로 반환됩니다. –

    1
    • 널은 .NET 2.0 정의 널이 될 수없는 값 유형에 대한 널 (null)을 표현하는 방법으로 첨가.
    • DateTime과 동일합니다.MinValue - DateTime은 값 유형이므로 은 null 일 수 없으므로 DateTime.MinValue와 같이 잘 알려진 값인 은 이 null 인 것으로 간주됩니다. 또한 다른 용도도 있습니다.
    +0

    나는 마지막 점에 경의를 표합니다 ... DBNull은 Nullable 유형으로 대체되지 않습니다. – Cerebrus

    +0

    DateTime.MinValue는 단순한 규칙이 아닙니다. 아무것도 할당되지 않은 경우 DateTime 변수의 값입니다. –

    +0

    @Cerbrus : 나는 또한 마지막 지점에 경연을 나설 것이다. DBNull은 C#에서는 null이 아니라 데이터베이스에서 null을 나타냅니다. Nullable은 C#에서는 null입니다. – Samuel

    1

    Null 값은 메모리가 아직 할당되지 않은 모든 참조 유형 개체를 나타냅니다.

    MinValueNull을 나타내지 않으며 주어진 값 유형이 가질 수있는 가능한 가장 작은 상수 값을 나타내는 데 종종 사용되는 속성입니다.

    DBNull.Value 클래스는 반환 된/데이터베이스로 전달 된 Null 매핑입니다.

    Nullable 제네릭 형식을 사용하면 Null 값을 값 형식에 할당 할 수 있습니다.

    0

    참조 유형 변수는 실제 인스턴스에 대한 포인터이기 때문에 참조 유형 (일명 객체)은 null로 설정할 수 있습니다. 변수를 직접 null로 설정할 수 있기 때문에 인스턴스가 부족하다는 것을 나타냅니다.

    값 유형의 경우 값 유형 변수가 항상 값을 포함하므로이 값은 조금 더 어렵습니다. 따라서 Double.MinValue 또는 DateTime.MinValue의 사용은 Null 허용 전 일에 다소 유효합니다. 당시에는 가치 유형에 가치가없는 것을 쉽게 표현할 수있는 방법이 없었습니다.

    double? d = null; 
    

    을 그리고, 따라서 당신은 또한 값 타입 변수는 널 (null)이 포함 가질 수 있습니다 : 이제

    , nullable 형식으로 당신이 말할 수 있습니다.

    System.DBNull은 데이터 집합에서 "NULL"값을 표현하는 것과 직접 관련되기 때문에 다른 이야기입니다. 이것은 DBNull을 대체하는 null 가능 유형 앞에 도입되었습니다. .NET에서

    0

    대부분의 유형 참조 종류 및 null 어떤 개체가 없습니다 표시하는 변수 또는 필드에 할당 할 수 있습니다 "참조하지"입니다.

    .NET의 다른 모든 유형은 값 유형입니다. 항상 값 유형이있는 값이 있으므로 "값 없음"을 표시 할 수 없습니다. 따라서, 구현은이를 나타 내기위한 특정 특수 값을 정의 할 수 있습니다. 종종 값 유형의 MinValue (상수) 필드가이 용도로 사용됩니다. 따라서 생년월일에 DateTime.MinValue을 사용하면 '알 수 없음'또는 '해당 사항 없음'(예 : 법인 단체)을 나타낼 수 있습니다.

    DbNUll은 RDBMS의 의미가 NULL인데, 이는 .NET과 약간 다릅니다. 대부분의 경우 이것은 null 또는 유사하게 변환됩니다.

    마지막으로, Nullable<T>은 값 유형이 더 직접적으로 표현 "알 수 없습니다"하는 래퍼이며, 일반적으로 MinValue를 사용하는 것보다 더 나은 옵션이지만, Nullable<T> 전에, 그래서 오래된 디자인 MinValue를 사용하기 시작했을 수 있습니다 .NET이 추가되었습니다 사용할 수 있습니다.

    0

    이용 약관이 서로 다른 널 (null) 값을 이해하기위한 가장 좋은 방법은 그들을 시도하고 여기에 일을 간단하게 할 수 있지만, 각각의 사용

    • 널 (null)이 참조 형식에서만 사용할 수있는 몇 가지 가이드 라인이 무엇인지 볼 수있다 같은 컬렉션 및 사용자 정의 클래스 (문자열이 특별하다)
    • DBNull은 db 쿼리에서 나온 null 값입니다.
    • 우리는 소수에 null을 할당하거나

    • Null 허용 개발자 소수점과 같은 값 객체에 null 값을 할당하는 방법입니다 (그들이 값 객체) 우리는 MINVALUE의 속성에 할당 두 번 질수 있기 때문에,


    Nullable<int> is same as int?가 나는 차이를 이해하면 도움이되기를 바랍니다. class보다는 structure 것을 유형 :

    5
    • null에만 유효 참조 위한 유형이다.
    • .Net 또한 int, double, DateTime 등의 값 유형이 있습니다. 값 유형은 null 일 수 없으므로 일반적으로 이들 값을 기본값 인 type.MinValue 일 때와 비교하지만 뭔가있을 수 있습니다 (부울을 고려하십시오). 예).
    • Nullable<T>은 진정한 null 일 수있는 값 유형이있는 경우를위한 것입니다. 기본값 (아마도 MinValue)도 유효하며 변수가 아직 할당되지 않은 경우와 구별해야합니다. C#에서는? (예 : int?) 짧은 값 표기법으로 값 유형을 지정했지만 여전히 Nullable<T>을 작성 중입니다.
    • DBNull은 특히 데이터베이스의 NULL 값을 참조합니다. 언어의 다른 곳에서 null을 사용하는 것과 같은 것은 아닙니다. 이는 데이터베이스와 대화 할 때만 사용되므로 쿼리가 언제 null 값을 반환했는지 알 수 있습니다.
    • 제네릭을 사용할 때 default(T) 구조가 사용 된 것을 볼 수 있습니다. 여기서 T는 유형 매개 변수입니다. 이렇게하면 해당 유형이 참조 유형인지 또는 값 유형인지 알지 못하는 채로 유형의 기본값을 설정할 수 있으며 특정 값 유형의 기본값보다 훨씬 적습니다.
    0

    여기서 중요한 차이점은 값 유형과 참조 유형 간의 차이입니다. 값 형식은 특정 값을 직접 나타내지 만 참조 형식은 값을 나타내는 메모리 위치를 가리 킵니다. 참조 유형이 유효한 내용이있는 메모리 위치를 실제로 가리 키지 않으면 참조는 Null입니다.

    값 유형은 값의 직접적인 표현이므로 null 일 수 없습니다. 그러나 값 유형의 실제 값을 알 수없는 경우가있을 수 있습니다. 이 경우 .NET은 Nullable 유형을 제공합니다. 그러나 그러한 구성을 사용할 수없는 경우 사람들은 MinValue와 같은 특수 값이나 기본값을 사용하는 경향이 있습니다.

    데이터베이스와 통신 할 때 값 유형이 될 것으로 예상되는 많은 것들은 실제로 데이터베이스가 알 수없는 값을 처리하는 방식이므로 Null 일 수 있습니다. Nullable 유형으로도 해결할 수 있지만 항상 사용할 수있는 것은 아닙니다. 그래서 DBNull이 존재하여 데이터베이스에서 가능한 null을 처리합니다.