Visual Basic .NET Language
열거 형
수색…
열거 형 정의
열거 형은 논리적으로 관련된 상수 집합입니다.
Enum Size
Small
Medium
Large
End Enum
Public Sub Order(shirtSize As Size)
Select Case shirtSize
Case Size.Small
' ...
Case Size.Medium
' ...
Case Size.Large
' ...
End Select
End Sub
구성원 초기화
각 enum 멤버는 값으로 초기화 될 수 있습니다. 값이 멤버에 대해 지정되지 않은 경우 기본적으로 멤버 목록의 첫 번째 멤버 인 경우 0으로 초기화되고 이전 멤버의 값보다 1만큼 큰 값으로 초기화됩니다.
Module Module1
Enum Size
Small
Medium = 3
Large
End Enum
Sub Main()
Console.WriteLine(Size.Small) ' prints 0
Console.WriteLine(Size.Medium) ' prints 3
Console.WriteLine(Size.Large) ' prints 4
' Waits until user presses any key
Console.ReadKey()
End Sub
End Module
Flags 특성
<Flags>
속성을 사용하면 enum이 플래그 집합이됩니다. 이 특성을 사용하면 여러 값을 enum 변수에 할당 할 수 있습니다. 플래그 열거 형의 멤버는 2의 제곱으로 초기화되어야합니다 (1, 2, 4, 8 ...).
Module Module1
<Flags>
Enum Material
Wood = 1
Plastic = 2
Metal = 4
Stone = 8
End Enum
Sub Main()
Dim houseMaterials As Material = Material.Wood Or Material.Stone
Dim carMaterials as Material = Material.Plastic Or Material.Metal
Dim knifeMaterials as Material = Material.Metal
Console.WriteLine(houseMaterials.ToString()) 'Prints "Wood, Stone"
Console.WriteLine(CType(carMaterials, Integer)) 'Prints 6
End Sub
End Module
HasFlag ()
HasFlag()
메서드를 사용하여 플래그가 설정되어 있는지 확인할 수 있습니다.
Module Module1
<Flags>
Enum Material
Wood = 1
Plastic = 2
Metal = 4
Stone = 8
End Enum
Sub Main()
Dim houseMaterials As Material = Material.Wood Or Material.Stone
If houseMaterials.HasFlag(Material.Stone) Then
Console.WriteLine("the house is made of stone")
Else
Console.WriteLine("the house is not made of stone")
End If
End Sub
End Module
Flags-attribute 및 사용 방법에 대한 자세한 내용은 공식 Microsoft 설명서를 참조하십시오.
문자열 파싱
Enum 인스턴스는 Enum의 문자열 표현을 구문 분석하여 만들 수 있습니다.
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim shirtSize As Size = DirectCast([Enum].Parse(GetType(Size), "Medium"), Size)
' Prints 'Medium'
Console.WriteLine(shirtSize.ToString())
' Waits until user presses any key
Console.ReadKey()
End Sub
End Module
참고 항목 : VB.NET에서 문자열을 Enum 값으로 구문 분석
GetNames ()
지정된 열거 형에있는 상수의 이름을 문자열 배열로 반환합니다.
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim sizes = [Enum].GetNames(GetType(Size))
For Each size In sizes
Console.WriteLine(size)
Next
End Sub
End Module
산출:
작은
매질
큰
GetValues ()
'이 메서드는 Enum 값을 반복하는 데 유용합니다.'
Enum Animal
Dog = 1
Cat = 2
Frog = 4
End Enum
Dim Animals = [Enum].GetValues(GetType(Animal))
For Each animal in Animals
Console.WriteLine(animal)
Next
인쇄물:
1
2
4
ToString ()
열거 형의 ToString
메서드는 열거 형의 문자열 이름을 반환합니다. 예를 들면 :
Module Module1
Enum Size
Small
Medium
Large
End Enum
Sub Main()
Dim shirtSize As Size = Size.Medium
Dim output As String = shirtSize.ToString()
Console.WriteLine(output) ' Writes "Medium"
End Sub
End Module
그러나 열거 형의 실제 정수 값에 대한 문자열 표현이 필요한 경우 열거 형을 Integer
캐스팅 한 다음 ToString
을 호출 할 수 있습니다.
Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output) ' Writes "1"
열거 형에 FlagsAttribute가 지정되었는지 여부를 확인하십시오.
다음 예제에서는 열거 형에 FlagsAttribute가 지정되었는지 여부를 확인하는 데 사용할 수 있습니다. 사용 된 방법론은 Reflection을 기반으로합니다.
이 예제는 True
결과를 제공합니다.
Dim enu As [Enum] = New FileAttributes()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)
이 예제는 False
결과를 줄 것입니다 :
Dim enu As [Enum] = New ConsoleColor()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)
다음과 같은 일반적인 용도 확장 방법을 설계 할 수 있습니다.
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function HasFlagsAttribute(ByVal sender As [Enum]) As Boolean
Return sender.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
End Function
사용 예제 :
Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()
For-each 플래그 (플래그 반복)
매우 특정한 시나리오에서는 소스 열거의 각 플래그에 대해 특정 작업을 수행해야 할 필요성을 느끼게됩니다.
우리는이 작업을 실현하는 간단한 Generic 확장 방법을 작성할 수 있습니다.
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub ForEachFlag(Of T)(ByVal sender As [Enum],
ByVal action As Action(Of T))
For Each flag As T In sender.Flags(Of T)
action.Invoke(flag)
Next flag
End Sub
사용 예제 :
Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
flags.ForEachFlag(Of FileAttributes)(
Sub(ByVal x As FileAttributes)
Console.WriteLine(x.ToString())
End Sub)
플래그 조합에서 플래그의 양을 결정하십시오.
다음 예는 지정된 플래그 조합에서 플래그의 수를 세는 것입니다.
이 예제는 확장 메서드로 제공됩니다.
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
사용 예제 :
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)
열거 형에서 가장 가까운 값 찾기
다음 코드는 Enum 의 가장 가까운 값을 찾는 방법을 보여줍니다.
먼저 검색 조건 (검색 방향)을 지정하는 역할을하는이 Enum 을 정의합니다.
Public Enum EnumFindDirection As Integer
Nearest = 0
Less = 1
LessOrEqual = 2
Greater = 3
GreaterOrEqual = 4
End Enum
이제 검색 알고리즘을 구현합니다.
<DebuggerStepThrough>
Public Shared Function FindNearestEnumValue(Of T)(ByVal value As Long,
ByVal direction As EnumFindDirection) As T
Select Case direction
Case EnumFindDirection.Nearest
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Order By Math.Abs(value - Convert.ToInt64(enumValue))
).FirstOrDefault
Case EnumFindDirection.Less
If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) < value
).LastOrDefault
End If
Case EnumFindDirection.LessOrEqual
If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) <= value
).LastOrDefault
End If
Case EnumFindDirection.Greater
If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) > value
).FirstOrDefault
End If
Case EnumFindDirection.GreaterOrEqual
If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault
Else
Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
Where Convert.ToInt64(enumValue) >= value
).FirstOrDefault
End If
End Select
End Function
사용 예제 :
Public Enum Bitrate As Integer
Kbps128 = 128
Kbps192 = 192
Kbps256 = 256
Kbps320 = 320
End Enum
Dim nearestValue As Bitrate = FindNearestEnumValue(Of Bitrate)(224, EnumFindDirection.GreaterOrEqual)