.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
합니다. 의 차이 ToString
와 GetName
그 것이다 GetName
먼저 몇 가지를 확인해야합니다 :
- 입력하신 유형이 null이 아닙니다.
- 입력 한 유형은 실제로 열거 형입니다.
- 전달한 값이 null이 아닙니다.
- 전달한 값은 열거 형이 실제로 기본 유형으로 사용할 수있는 유형이거나 열거 형 자체의 유형입니다.
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()
소스를 읽는 사람에게 무엇을 하는지를 완전히 알기 때문에 최선의 선택 이라고 생각 합니다.