ITEM 19 : Ensure That 0 Is a Valid State for Value Types
(값 타입에 대해서 0값이 유효한 상태가 되게 반드시 보장해야한다.)
■ 요약 및 장점
1.기본 .NET 시스템에서 Object를 초기화 할 때 0으로 초기화 한다.
0으로 초기화 하는 값타입의 인스턴스를 막을 수 없다.
2.값타입을 만들때 기본값을 만들어야 한다.
3.하나의 예가 enums다. enums은 System.ValueType으로부터 파생된다.
public enum Planet { // Explicitly assign values. // Default starts at 0 otherwise. Mercury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Neptune = 7, Uranus = 8 // First edition included Pluto. } Planet sphere = new Planet();
이렇게 초기화 하면 sphrere는 기본 0으로 초기화 되는데, 0은 유효한 값이 아니다.
이럴때에는 명시적으로 Planet sphere2 = Planet.Mars; 선언해줘야 한다.
하지만 다른타입에 속해있다면 유효한값으로 초기화 하기가 더 힘들어진다.
public struct ObservationData { private Planet whichPlanet; //what am I looking at? private double magnitude; // perceived brightness. }
따라서 아래와 같이 0이 의미있는 상태로 만들어줘야 한다.
public enum Planet2 { None = 0, Mercury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Neptune = 7, Uranus = 8 }
4. enums에서 특별하게 Flags Attribute 를 사용할때가 있는데 이렇게 하면
항상 None 값이 0이 되어야 한다.
[Flags] public enum Styles { None = 0, Flat = 1, Sunken = 2, Raised = 4, }
5.보통 프로그래머들은 AND operator를 사용해서 None값으로 초기화 됐을때 코드가
실행이 되지 않게 처리하는 방법을 쓰고있다.
if ((flag & Styles.Flat) != 0) // Never true if Flat == 0.
DoFlatThings();
6.다른 초기화 문제는 참조를 포함하는 값타입에서 발생한다.
public struct LogMessage { private int ErrLevel; private string msg; } LogMessage MyMessage = new LogMessage();
이렇게 초기화 하면 msg가 Null값을 갖는다. 이것을 막을 수가 없는데 이럴때에는 프로퍼티를 이용해서 getter에서
msg가 null 인지 체크해서 null이면 string.Empty를 리턴하면 된다.
■ Terms
■ 단어
As it stands: 현상태 그대로
magnitude:규모,광도
don't make any sense:전혀 말이 안된다.
make sense:타당하다.
sphere:구체
perceive:감지하다.
faulty:흠이있는,불완전한
'프로그래밍 > Effective C#' 카테고리의 다른 글
ITEM 20 : 변경불가능한 아토믹 값타입을 선호해라 (0) | 2015.05.06 |
---|---|
ITEM 18 : 값 타입과 참조 타임을 구별하라 (0) | 2015.04.23 |
ITEM 17 : 표준 Dispose 패턴을 구현하라 (0) | 2015.04.23 |
ITEM 16 : 불필요한 오브젝트 생성을 하지마라 (0) | 2015.04.23 |
ITEM 15 : 리소스 해제를 위해서 using과 try/finally 구문을 사용하라. (0) | 2014.05.30 |