문제

.NET의 널 값과 변수에 대해 약간 혼란스러워합니다. (VB 선호)

객체인지 값 유형인지 여부에 관계없이 특정 변수의 "널스"를 확인할 수있는 방법이 있습니까? 아니면 내 null 검사가 항상 값 유형 (예 : System.integer)을 확인하는지 여부를 항상 예상해야합니까?

내가 찾고있는 것은 가능한 모든 종류의 귀무를 확인하는 기능이라고 생각합니다. 즉, 모든 유형의 변수입니다

a) 선언 된 이후로 값이 할당되지 않았습니다

b) 데이터 개체 (데이터베이스에서 나온)에서 null 값이 할당되었습니다.

c)는 널 인 다른 변수 값과 동일하게 설정되었습니다.

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

.NET에서 NULL 시나리오를 처리 할 때 일반적인 모범 사례가 있습니까?

업데이트: "널"인 값 유형에 대해 이야기 할 때, 실제로 의미하는 바는 결코 설정되지 않았거나 어떤 시점에서 널 객체와 동일하거나 주조 된 값 유형입니다.

도움이 되었습니까?

해결책

정상 값 유형 (부울, int, 롱, 플로트, 이중, 열거 및 구조)은 무효가되지 않습니다.

모든 값 유형의 기본값은 0입니다.

CLR은 변수가 설정되지 않으면 액세스 할 수 없습니다. 이것이 항상 그런 것은 아니라고 생각할 수도 있지만 때로는 CLR이 들어가서 초기화됩니다. 메소드 레벨에서 모든 변수가 사용하기 전에 명시 적으로 초기화해야합니다.

또한, 다른 사람들이 지적한 것처럼 .NET 2.0이므로 새로운 일반 유형이 있습니다. Nullable<T>. int와 같은 C#에는 일부 컴파일러 속기가 있습니까? 수단 Nullable<int>, 더블? 수단 Nullable<double> 등.

당신은 만 포장 할 수 있습니다 Nullable<T> 불가능한 값 유형에 비해, 참조는 이미 무효가 될 수 있기 때문에 괜찮습니다.

int? x = null;

int?의 경우 NULL에 대해 테스트 할 수는 있지만 때로는 전화하는 것이 더 좋습니다. x.HasValue().

C#에는 또한도 있습니다 귀찮은 연합 연산자 ?? 무효가되지 않는 값 유형에 nullable을 할당하려는 경우. 그러나 연산자가없는 경우 getValueordeFault ()에게 전화 할 수 있습니다.

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

다른 팁

값 유형은 널가 될 수 없습니다. 가치 유형이라는 의미를 위반합니다. 값 유형을 널리킹 가능한 (t)로 랩핑하여 훌륭한 방법 세트를 제공하고 아무것도 작동하지 않는지 확인할 수 있습니다. 그러나 당신은 그 래퍼로 많은 오버 헤드를 가지고 있습니다. 아마도 당신이하려는 일을 명확히 할 수 있습니까?

완전성을 위해 Nullable Wrappers의 VB 구문은 다음과 같습니다.

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

편집 : 값 유형은 항상 기본값으로, 숫자의 경우 0, 부울의 경우 오 탐지 등으로 사전 설정됩니다.

이것이 당신이 추구하는 것입니까?

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

사실 나는 당신이 왜이 구조를 원하는지 확실하지 않습니다. DBNULL.VALUE를 확인한 유일한 시간은 데이터베이스에서 나온 값을 사용할 때와 데이터 네임 스페이스 클래스에서 다른 클래스로 값을 할당하기 전에 [즉, Dim B as String = DataReader (0)입니다. ].

일반적으로, 인스턴스화되지 않았거나 다시 변환 해야하는 객체가 걱정된다면, 단지 끔찍한 점검만으로도 충분합니다.

내가 알고있는 두 가지 유형의 널 인 .NET에서는 NULL (VB에서는 아무것도 없음)과 dbnull입니다. System.Nullable을 사용하는 경우 객체와 동일한 NULL Checking 구문을 사용할 수 있습니다. 귀찮은 객체가 박스형 인 경우 .NET 2.0 CLR은이를 처리 할 수있는 올바른 방법을 파악할 수있을만큼 똑똑합니다.

두 유형 모두에 실행 한 유일한 경우는 데이터베이스 데이터에 직접 액세스 할 수있는 응용 프로그램의 데이터 계층에 있습니다. 예를 들어, 나는 데이터 가능에서 dbnull을 사용했습니다. 이 sitation 에서이 널 유형을 모두 확인하려면 (C#의 미안)와 같은 확장 방법을 작성할 수 있습니다.

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

...

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

값 유형 변수에는 NULL을 포함 할 수 없습니다. NULL이 의미하는 바는 NULL이 참조가 아무데도 없음을 의미하기 때문입니다. vb.net에서는 알지 못하지만 C#에서는 "?"를 사용하여 값 값 유형을 kaullables로 랩핑 할 수 있습니다.

int? a = null;

옵션 Strict On으로 개발하는 한 (a) 문제가되지 않아야합니다. 컴파일러가 당신에게 소리를 지 릅니다. 매개 변수 확인이 걱정된다면 사용하십시오.

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를 사용하는 경우이를 처리하는 방법이 있습니다. 입력 된 데이터 세트를 사용하는 경우 행에 자동 생성되는 .ismyvariabelenull 속성이 있습니다.

(c)의 경우, 값 유형에 대해 걱정할 필요는 없지만 참조 유형은 간단한 일로 확인할 수 있습니다.

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

대부분의 경우 간단한 점검은 아무것도 당신을 데려 갈 것입니다. 데이터베이스 상호 작용 계층을 사용하면 데이터에서 널 값의 끈적 끈적한 케이스를 처리하는 데 도움이되지만 적절하게 처리하는 것은 귀하에게 달려 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top