ITEM 19 : 값 타입에 대해서 0값이 유효한 상태가 되게 반드시 보장해야한다.

|

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:흠이있는,불완전한


And