특정 상황에서 정의된 값이 없는 값 형식으로 작업하는 경우가 있습니다. 예를 들어 데이터베이스의 필드는 의미 있는 할당된 값이 있고 할당된 값이 없는 경우를 구분해야 할 수 있습니다. 값 형식은 정규 값 또는 null 값을 사용하도록 확장할 수 있습니다. 이러한 확장을 nullable 형식이라고합니다.
각 nullable 값 형식은 제네릭 Nullable<T> 구조에서 생성됩니다. 작업 관련 활동을 추적하는 데이터베이스를 고려합니다. 다음 예제에서는 nullable Boolean 형식을 생성하고 해당 형식의 변수를 선언합니다. 다음 세 가지 방법으로 선언을 작성할 수 있습니다.
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
변수 ridesBusToWork는 True 값, False 값, 또는 값이 없을 수 있습니다. 초기 기본값은 전혀 값이 아니며, 이 경우 이 사용자에 대한 정보를 아직 얻지 못했음을 의미할 수 있습니다. 대조적으로, False 정보를 얻고 사람이 출근하기 위해 버스를 타지 않는다는 것을 의미 할 수 있습니다.
nullable 값 형식을 사용하여 변수 및 속성을 선언할 수 있으며 nullable 값 형식의 요소를 사용하여 배열을 선언할 수 있습니다. nullable 값 형식을 매개 변수로 사용하여 프로시저를 선언할 수 있으며 프로시저에서 nullable 값 형식을 Function 반환할 수 있습니다.
배열, a 또는 클래스와 같은 참조 형식에서 nullable 형식을 생성할 String수 없습니다. 기본 형식은 값 형식이어야 합니다. 자세한 내용은 값 형식 및 참조 형식을 참조하세요.
Nullable 형식 변수 사용
nullable 값 형식의 가장 중요한 멤버는 해당 HasValue 및 Value 속성입니다. nullable 값 형식 HasValue 의 변수에 대해 변수에 정의된 값이 포함되어 있는지 여부를 알려줍니다. 이 HasValue 경우 True에서 Value 값을 읽을 수 있습니다.
HasValue 및 Value가 모두 ReadOnly 속성입니다.
기본값
nullable 값 형식으로 변수를 선언하면 해당 HasValue 속성의 False기본값은 .입니다. 즉, 기본적으로 변수에는 기본 값 형식의 기본값 대신 정의된 값이 없습니다. 다음 예제에서는 numberOfChildren 변수가 초기에는 정의된 값이 없으며, Integer 형식의 기본값은 0입니다.
Dim numberOfChildren? As Integer
null 값은 정의되지 않거나 알 수 없는 값을 나타내는 데 유용합니다. 선언이 numberOfChildren으로 이루어졌다면, 현재 정보를 사용할 수 없다는 것을 나타낼 수 있는 값이 없었을 것입니다.
값 저장
일반적으로 nullable 값 형식의 변수 또는 속성에 값을 저장합니다. 다음 예제에서는 이전 예제에서 선언된 변수 numberOfChildren 에 값을 할당합니다.
numberOfChildren = 2
nullable 값 형식의 변수 또는 속성에 정의된 값이 포함된 경우 값이 할당되지 않은 초기 상태로 되돌릴 수 있습니다. 다음 예제와 같이 변수 또는 속성을 Nothing로 설정하여 이 작업을 수행합니다.
numberOfChildren = Nothing
비고
nullable 값 형식의 변수에 Nothing를 할당할 수는 있지만, 등호를 사용하여 Nothing을 테스트할 수는 없습니다. 등호를 사용하는 비교는 someVar = Nothing 항상 Nothing으로 평가됩니다. 변수의 HasValue 속성을 False를 테스트하거나 Is, IsNot 연산자를 사용하여 테스트할 수 있습니다.
값 가져오기
nullable 값 형식의 변수 값을 검색하려면 먼저 해당 HasValue 속성을 테스트하여 값이 있는지 확인해야 합니다.
HasValue가 False일 때 값을 읽으려고 하면, Visual Basic에서 InvalidOperationException 예외가 발생합니다. 다음 예제에서는 이전 예제의 변수 numberOfChildren 를 읽는 권장 방법을 보여 줍니다.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Nullable 형식 비교
부울 식에서 nullable Boolean 변수를 사용하는 경우 결과는 TrueFalse 또는 Nothing일 수 있습니다. 다음은 And과 Or에 대한 진리 테이블입니다.
b1
b2 이제 세 개의 가능한 값이 있으므로 평가할 9개의 조합이 있습니다.
| b1 | b2 | b1 및 b2 | b1 또는 b2 |
|---|---|---|---|
Nothing |
Nothing |
Nothing |
Nothing |
Nothing |
True |
Nothing |
True |
Nothing |
False |
False |
Nothing |
True |
Nothing |
Nothing |
True |
True |
True |
True |
True |
True |
False |
False |
True |
False |
Nothing |
False |
Nothing |
False |
True |
False |
True |
False |
False |
False |
False |
부울 변수 또는 식의 값이 Nothing일 때, 그것은 true도 아니고 false도 아닙니다. 다음 예제를 고려해 보세요.
Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing
' The following If statement displays "Expression is not true".
If (b1 And b2) Then
Console.WriteLine("Expression is true")
Else
Console.WriteLine("Expression is not true")
End If
' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
Console.WriteLine("Expression is false")
Else
Console.WriteLine("Expression is not false")
End If
이 예제에서 b1 And b2은 Nothing로 평가됩니다. 결과적으로 Else 절은 각 If 문에서 실행되고 출력은 다음과 같습니다.
Expression is not true
Expression is not false
비고
AndAlso 및 OrElse는 단락 평가를 사용하며 첫 번째 피연산자가 Nothing로 평가될 때 두 번째 피연산자를 반드시 평가해야 합니다.
전파
산술, 비교, 시프트 또는 형식 연산의 피연산자 중 하나 또는 둘 다 null 허용 값 형식인 경우 작업의 결과는 null 허용 값 형식이기도 합니다. 두 피연산자가 모두 `Nothing`이 아닌 값을 갖고 있는 경우, 두 피연산자의 기본 값에 대해 연산이 수행되며, 이는 피연산자가 null을 허용하는 값 형식이 아닌 것처럼 처리됩니다. 다음 예제에서는 변수를 compare1sum1 암시적으로 입력합니다. 마우스 포인터를 놓으면 컴파일러가 둘 다에 대해 nullable 값 형식을 유추하는 것을 볼 수 있습니다.
' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2
' The comparison evaluated is 3 > 2, but compare1 is inferred to be of
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n
' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")
하나 또는 두 피연산자의 값 Nothing이 있는 경우 결과는 다음과 같습니다 Nothing.
' Change the value of n to Nothing.
n = Nothing
Dim compare2 = m > n
Dim sum2 = m + n
' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")
데이터와 함께 Nullable 형식 사용
데이터베이스는 nullable 값 형식을 사용하는 가장 중요한 위치 중 하나입니다. 현재 모든 데이터베이스 개체가 nullable 값 형식을 지원하지는 않지만 디자이너에서 생성된 테이블 어댑터는 지원합니다. nullable 형식에 대한 TableAdapter 지원을 참조하세요.
참고하십시오
- InvalidOperationException
- HasValue
- 데이터 형식
- 값 형식 및 참조 형식
- 데이터 형식 문제 해결
- TableAdapters 사용하여 데이터 세트 채우기
- If 연산자
- 로컬 형식 유추
- Is 연산자
- IsNot 연산자
- 널 가능 값 형식(C#)
.NET