Section 23.1: 튜플 (tuple) 요소 접근하기

튜플의 각 요소들에 접근하기 위해서는 Item1-Item8 속성 (property) 을 사용할 수 있다. 대상 튜플의 크기보다 같거나 작은 색인 (index) 숫자를 가진 속성만 사용 가능할 것이다 (예를 들어, Tuple<T1,T2> 로 선언된 튜플에 대해서는 Item3 속성에 접근할 수 없다).

var tuple = new Tuple<string, int, bool, MyClass>("foo", 123, true, new MyClass()); var item1 = tuple.Item1; // "foo" var item2 = tuple.Item2; // 123 var item3 = tuple.Item3; // true var item4 = tuple.Item4; // new My Class()
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.11: Enum 을 사용한 비트 논리 (bitwise) 연산

Enum 이 단일 값 하나만을 나타내는 것이 아니라, 플래그들의 집합을 나타내기 위해 사용된다면 FlagsAttribute 을 사용하여야 한다. 각 Enum 항목에 할당되어 있는 숫자 값들을 활용하여 비트 논리 연산 이후의 값이 표시될 것이다.

예제 1 : [Flags] 사용 시

[Flags] enum Colors { Red=1, Blue=2, Green=4, Yellow=8 } var color = Colors.Red | Colors.Blue; Console.WriteLine(color.ToString());

출력 결과:

Red,Blue

예제 1 : [Flags] 미 사용 시

enum Colors { Red=1, Blue=2, Green=4, Yellow=8 } var color = Colors.Red | Colors.Blue; Console.WriteLine(color.ToString());

출력 결과:

3
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.10: Enum 의 모든 항목들에 대한 이름 얻어오기

enum MyEnum { One, Two, Three } foreach(MyEnum e in Enum.GetValues(typeof(MyEnum))) Console.WriteLine(e);

위 코드는 아래와 같은 결과를 출력해 줄 것이다:

One Two Three
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.9: Enum 값에 부가적인 세부 설명을 추가하기

경우에 따라서, Enum 값의 이름만으로는 사용자에게 표시해주고자 하는 정보를 모두 표현하기가 어렵다는 등의 이유로, 각 Enum 들에 대해 추가적인 설명을 덧붙이고 싶을 수가 있다. 이러한 경우에는 System.ComponentModel.DescriptionAttribute 클래스를 사용할 수 있다.

예제:

public enum PossibleResults { [Description("Success")] OK = 1, [Description("File not found")] FileNotFound = 2, [Description("Access denied")] AccessDenied = 3 }

이제, 특정 Enum 값에 대해 기술된 부가 설명 내용을 반환하고자 한다면 아래와 같은 방법을 사용할 수 있다:

public static string GetDescriptionAttribute(PossibleResults result) { return ((DescriptionAttribute) Attribute.GetCustomAttribute((result.GetType().GetField(result.ToString())), typeof (DescriptionAttribute))).Description; } static void Main(string[] args) { PossibleResults result = PossibleResults.FileNotFound; Console.WriteLine(result); // "FileNotFound" 를 출력한다 Console.WriteLine(GetDescriptionAttribute(result)); // "File not found" 를 출력한다 }

위 코드는 모든 Enum 들에 적용 가능한 extension method 형태로 손쉽게 변환될 수 있다:

static class EnumExtensions { public static string GetDescription(this Enum enumValue) { return ((DescriptionAttribute) Attribute.GetCustomAttribute((enumValue.GetType().GetField(enumValue.ToString())), typeof (DescriptionAttribute))).Description; } }

이제 다음과 같이 간단하게 사용이 가능하다:

Console.WriteLine(result.GetDescription());
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.8: Enum 의 기본값

Enum 의 기본값은 0 이다. 만약 어떤 Enum 이 0 값에 해당하는 항목을 정의하고 있지 않다면, 기본값은 특정 Enum 항목이 아닌 숫자 0 으로 처리될 것이다.

public class Program { enum EnumExample { one = 1, two = 2 } public void Main() { var e = default (EnumExample); if (e == EnumExample.one) Console.WriteLine("defaults to one"); else Console.WriteLine("Unknown"); } }

출력 결과:

Unknown

예제: https://dotnetfiddle.net/l5Rwie

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.7: 예상치 못한 값으로 변경될 수도 있는 Enum

Enum 은 기반이 되는 숫자형 데이터 타입으로 상호 변환이 될 수 있기에, 그 값이 Enum 타입이 정의되었던 값 범위에서 벗어나는 경우가 생길 수 있다.

아래에 정의된 Enum 타입인 DaysOfWeek 는 7개의 값에 대해서만 선언이 되어 있지만, 실제적으로 Enum 변수는 어떠한 int 값이라도 가질 수가 있다.

public enum DaysOfWeek { Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6, Sunday = 7 } DaysOfWeek d = (DaysOfWeek)31; Console.WriteLine(d); // 31 이 출력된다 DaysOFWeek s = DaysOfWeek.Sunday; s++; // 에러가 발생되지 않는다

현재로써는 Enum 으로 하여금 이러한 동작을 막을 수 있도록 선언하는 방법이 존재하지 않는다.

그러나, 선언되지 않은 Enum 값을 Enum.IsDefined 메소드를 통해 감지해 낼 수는 있다. 예를 들어,

DaysOfWeek d = (DaysOfWeek)31; Console.WriteLine(Enum.IsDefined(typeof(DaysOfWeek),d)); // False 를 출력한다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.6: Enum 을 문자열에서 변환하거나 문자열로 변환하기

public enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } // Enum 을 문자열로 변환 string thursday = DayOfWeek.Thursday.ToString(); // "Thursday" string seventhDay = Enum.GetName(typeof(DayOfWeek), 6); // "Saturday" string monday = Enum.GetName(typeof(DayOfWeek), DayOfWeek.Monday); // "Monday" // 문자열을 Enum 으로 변환 (.NET 4.0+ 필요 - 이전 버전의 .NET 에서 동작하는 대안 문법은 페이지 하단 참고) DayOfWeek tuesday; Enum.TryParse("Tuesday", out tuesday); // DayOfWeek.Tuesday DayOfWeek sunday; bool matchFound1 = Enum.TryParse("SUNDAY", out sunday); // false 를 반환한다 (대소문자 구분) DayOfWeek wednesday; bool matchFound2 = Enum.TryParse("WEDNESDAY", true, out wednesday); // true 를 반환한다; DayOfWeek.Wednesday (대소문자 구분하지 않음) // 문자열을 Enum 으로 변환 (모든 .NET 버전에서 지원) DayOfWeek friday = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Friday"); // DayOfWeek.Friday DayOfWeek caturday = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Caturady"); // ArgumentException 을 발생시킨다 (throw) // Enum 타입에 대한 모든 이름들을 문자열로 얻어온다 string[] weekdays = Enum.GetNames(typeof(DayOfWeek));
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 22.5: enum 변수에 플래그 값을 추가하거나 제거하기

아래의 코드는 플래그 스타일의 enum instance 에 값을 추가하거나 제거하는 예제를 보여준다:

[Flags] public enum MyEnum { Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2 } var value = MyEnum.Flag1; // 값 추가하기 value |= MyEnum.Flag2; // value 값은 이제 Flag1, Flag2 가 된다 value |= MyEnum.Flag3; // value 값은 이제 Flag1, Flag2, Flag3 이 된다 // 값 제거하기 value &= ~MyEnum.Flag2; // value 값은 이제 Flag1, Flag3 이 된다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts