[.net] 열거 형을 문자열로 변환

.NET 3.5에서 Enum을 String으로 변환하는 가장 좋은 방법은 무엇입니까?

  • 열거 형 GetName
  • 열거 형식
  • ToString

왜이 중 하나를 다른 것보다 선호해야합니까? 하나 더 잘 수행합니까?



답변

C # 6부터 열거 형의 이름을 얻는 가장 좋은 방법은 새로운 nameof연산자입니다.

nameof(MyEnum.EnumValue);

// Ouputs
> "EnumValue"

컴파일 타임에 열거 형이 컴파일 된 결과의 문자열로 바뀌어 작동하며, 이것이 가장 빠른 방법임을 의미합니다.

열거 형 이름의 난독 화가 가치 있거나 중요하다고 생각되면 열거 형 이름을 사용하면 코드 난독 화를 방해 할 수 있습니다. 이는 아마도 다른 질문 일 것입니다.


답변

우리 프로젝트를 위해 일하십시오 …

public static String convertToString(this Enum eff)
{
    return Enum.GetName(eff.GetType(), eff);
}

public static EnumType converToEnum<EnumType>(this String enumValue)
{
    return (EnumType) Enum.Parse(typeof(EnumType), enumValue);
}


답변

내 테스트에서 Enum.GetName더 빠르고 괜찮은 마진이있었습니다. 내부적으로 ToString호출합니다 Enum.GetName. .NET 4.0 용 소스 에서 필수 사항 :

public override String ToString()
{
     return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
}

private static String InternalFormat(RuntimeType eT, Object value)
{
    if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
    {
        String retval = GetName(eT, value); //<== the one
        if (retval == null)
            return value.ToString();
        else
            return retval;
    }
    else
    {
        return InternalFlagsFormat(eT, value);
    }
}

나는 그것이 확실한 이유라고 말할 수는 없지만 테스트는 하나가 다른 것보다 빠릅니다. 두 통화 모두 권투와 관련이 있으며 (실제로 리플렉션 통화이므로 필드 이름을 검색하는 중임) 원하는대로 느릴 수 있습니다.

테스트 설정 : 8 개의 값을 가진 열거 형, 아니요. 반복 횟수 = 1000000

결과 : Enum.GetName => 700 ms, ToString => 2000 ms

속도가 눈에 띄지 않으면 ToString훨씬 깨끗한 통화를 제공하므로 신경 쓰지 않고 사용하지 않습니다 . 대조

Enum.GetName(typeof(Bla), value)

value.ToString()


답변

Enum.GetName (…)

이것은 가장 우아한 방법입니다.

var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);

전화 .ToString()시간이 짧기 때문에 전화 문제는 보이지 않습니다 .

var enumValueString = MyEnum.MyValue.ToString();

새로운 C # 6 구문으로 다음을 사용할 수 있습니다.

nameof(MyEnum.MyValue)


답변

내부적으로는 모두라는 메소드를 호출 InternalGetValueAsString합니다. 의 차이 ToStringGetName그 것이다 GetName먼저 몇 가지를 확인해야합니다 :

  1. 입력하신 유형이 null이 아닙니다.
  2. 입력 한 유형은 실제로 열거 형입니다.
  3. 전달한 값이 null이 아닙니다.
  4. 전달한 값은 열거 형이 실제로 기본 유형으로 사용할 수있는 유형이거나 열거 형 자체의 유형입니다. GetType이를 확인하기 위해 값을 사용 합니다.

.ToString위의 문제는 클래스 자체가 아니라 전달 된 버전이 아니라 호출되므로 .ToString메소드에 동일한 확인 문제 가 없기 때문에 위의 문제에 대해 걱정할 필요 가 없습니다. 정적 방법으로, .ToString값을 문자열로 얻는 가장 빠른 방법 이라고 결론 내릴 것 입니다.


답변

내가 찾을 수있는 가장 좋은 것은 MSDN 에서이 관련이없는 질문입니다 . 이러한 방법은 모두 같은 결함을 공유합니다. 즉 enum.toString(), Dotfuscation을 사용할 때 제대로 작동하지 않습니다 . 다른 문제는 간접 권투 (GetName 및 Format)와 관련이있는 것으로 보입니다. 불행히도, 위의 것을 사용하는 성능상의 이유를 찾을 수 없습니다.

으로부터 의역 XML 조각 ,

boxed 열거 형을 string.Format () 또는 다른 함수에 전달하면 enum.ToString()호출 될 수 있습니다 . Dotfuscating 때 문제가 발생합니다. 당신은 사용하지 말아야합니다 enum.ToString(), enum.GetNames(), enum.GetName(), enum.Format()또는 enum.Parse()문자열로 열거를 변환 할 수 있습니다. 대신 switch 문을 사용하고 필요한 경우 이름을 국제화하십시오.


답변

Enum.GetName()

Format()실제로 GetName()일부 서식 기능 (또는 InternalGetValueAsString()정확) 으로 래퍼 입니다. ToString()와 거의 동일합니다 Format(). 나는 GetName()소스를 읽는 사람에게 무엇을 하는지를 완전히 알기 때문에 최선의 선택 이라고 생각 합니다.