2008-10-02 7 views
6

.NET에서 null 값과 변수에 대해 약간 혼란 스럽습니다. (VB 선호).NET DBNull과 모든 변수 유형 간에는 아무 것도 없습니까?

개체 또는 값 형식인지 여부에 관계없이 주어진 변수의 "nullness"를 확인할 수있는 방법이 있습니까? 또는 null 체크는 값 유형 (예 : System.Integer) 또는 객체를 검사하는지 여부를 항상 예측해야합니까?

내가 찾고있는 것은 null-ness의 가능한 모든 종류를 검사하는 함수입니다. 즉,) 데이터베이스로부터 제공된 데이터 객체()

C에서 널값 하였다 할당 된

a)는 선언

B 보낸 값이 할당되지 않았던 것을 변수의 모든 유형) 인 집합이 null이 아닌 다른 변수 값과 같음

d)가 설정되지 않았거나 만료 된 ASP.NET 세션/응용 프로그램 변수로 설정되었습니다.

.NET에서 null 시나리오를 처리 할 때는 일반적으로 가장 좋은 방법이 있습니까?

업데이트 : "null"값 유형에 대해 이야기 할 때 실제로 의미하는 것은 설정되지 않았거나 null 개체와 동일하게 설정되거나 어떤 지점에 있던 값 형식입니다.

답변

2

정상 값 유형 (부울, 정수, long, float, double, enum 및 struct)은 Null을 허용하지 않습니다.

모든 값 형식의 기본값은 설정되지 않는 한 당신이 변수에 액세스 할 수 없습니다 0

CLR을합니다. 이것이 항상 그런 것은 아니라고 생각할 수도 있지만 때로는 CLR이 단계별로 사용자를 대신하여 초기화합니다. 메소드 레벨에서 모든 변수를 사용하기 전에 명시 적으로 초기화해야합니다.

또한 다른 사람들은 .net 2.0 이후 Nullable<T>이라는 새로운 제네릭 유형이 있음을 지적합니다. C#에는 int와 같은 일부 컴파일러 단축 문자가 있습니까? 즉, Nullable<int>을 의미합니까? Nullable<double>을 의미합니다.

참조 할 수없는 값 유형에 대해서만 Nullable<T>을 감쌀 수 있습니다. 이는 참조가 이미 null 일 가능성이 있으므로 괜찮습니다. 당신이 널 (null)에 대해 테스트 할 수 있습니다 동안 인터넷 용

int? x = null; 

은?, 그것은 x.HasValue()를 호출 때때로 좋네요.

C#에는 nullable coalescing operator ??도 있습니다. Null을 허용 할 수없는 값 유형에 Null을 지정할 때. 하지만 연산자가 없으면 GetValueOrDefault()를 호출 할 수 있습니다.

int y = x ?? 2; // y becomes 2 if x is null. 
int z = x.GetValueOrDefault(2); // same as y 
4

값 유형은 null 일 수 없습니다. 그것은 가치 유형이라는 것을 의미하는 것에 위배됩니다. 값 유형을 Nullable (Of T)로 랩핑하면 많은 메소드가 제공되고 아무 것도 작동하지 않는지 검사 할 수 있습니다. 하지만 당신은 그 래퍼로 많은 오버 헤드를 가지고있다. 아마도 당신이하려는 일을 명확히 할 수 있을까요?

은 완전성을 위해 Null 허용 래퍼에 대한 VB 구문은 다음과 같습니다

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0' 
Dim j as Integer? = Nothing '.NET 3.5' 

편집 : 값 유형이 항상 등

+0

규칙은 모든 값 유형에 대한 기본값은 (등, INT, 긴, 플로트, 더블, 열거 형, 구조체) –

0

값 형식 변수 부울에 대한 거짓, 수치 0, 디폴트 값으로 preinitialized된다 null를 포함 할 수 없다는 것은 null이 의미하기 때문에, null은 참조가 아무데도 가리 키지 않는다는 것을 의미한다. "?":

int? a = null; 
+0

INT 0 점이다? Nullable 에 대한 C# 컴파일러 단축형입니다. –

2

이인가 필요하시면 당신이 값 형식을 래핑 할 수 VB.net에 있지만 C#을에 나는처럼 사용 nullables 될 몰라?

if IsNothing(foo) OrElse IsDbNull(foo) Then 
    ' Do Something Because foo Is Either Nothing or DBNull.Value 
End If 

실제로이 구조가 필요한 이유는 확실하지 않습니다. DBNULL.Value를 확인하는 유일한 시간은 데이터베이스에서 온 값을 사용하고 DATA Namespace 클래스의 해당 값을 다른 클래스 [즉, dim b 문자열 = dataReader (0)].

일반적으로 개체가 인스턴스화되지 않았거나 다시 인스턴스화해야 할 필요가 있다고 생각되면 IsNothing 검사만으로 충분합니다.

1

.Net. 내가 인식하고있는 null의 두 가지 유형 (VB에서는 없음)과 DbNull입니다. System.Nullable을 사용하는 경우 객체와 마찬가지로 동일한 Null 검사 구문을 사용할 수 있습니다. Nullable 객체가 boxed되어 있다면 .Net 2.0 CLR은 이것을 처리 할 수있는 올바른 방법을 찾기에 충분히 똑똑합니다.

두 가지 유형으로 실행 한 유일한 경우는 데이터베이스 데이터에 직접 액세스하는 응용 프로그램의 데이터 계층에 있습니다. 예를 들어 DataTable에서 DbNull을 실행했습니다. 이 situration에서 이러한 널 유형 모두에 대해 확인하려면 (C#에서 미안)와 같은 확장 메서드를 작성할 수

static public bool IsNull(this object obj) 
{ 
    return obj != null && obj != DbNull.Value; 
} 

... 

if(dataTable[0]["MyColumn"].IsNull()) 
{ 
    //do something 
} 
0

을만큼 당신이 옵션 엄격한에 함께 개발하는 등, (a)는 shouldn ' 문제가되지 마라. 컴파일러가 너에게 소리 질러. 당신이 매개 변수에 대한 검사에 대해 걱정하는 경우, 다만, 데이터베이스 상호 작용 층이 처리해야 들어

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer) 
    if param1 is nothing then 
     Throw New ArgumentException("param1 cannot be null!") 
    end if 
    'param2 cannot be null 
End Sub 

(B)를 사용합니다. LINQ를 사용하는 경우이를 처리 할 수있는 방법이 있습니다. 형식화 된 데이터 세트를 사용하는 경우 자동 생성되는 행에 .IsMyVariableNull 속성이 있습니다.

(c)의 경우 값 유형에 대해 신경 쓸 필요는 없지만 간단한 유형 (IsNot Nothing)으로 참조 유형을 확인할 수 있습니다.

(d)의 경우 읽기 후에 동일한 논리를 적용 할 수 있습니다. 수신 변수를 Nothing에 대해 테스트하십시오.

대부분의 경우 Is Nothing은 간단한 체크를합니다. 데이터베이스 상호 작용 레이어는 데이터에서 null 값의 더 까다로운 케이스를 처리하는 데 도움이되지만 적절하게 처리하는 것은 사용자의 몫입니다.