.NET 3.5에서 Enum을 String으로 변환하는 가장 좋은 방법은 무엇입니까?
- 열거 형 GetName
- 열거 형식
- ToString
왜이 중 하나를 다른 것보다 선호해야합니까? 하나 더 잘 수행합니까?
.NET 3.5에서 Enum을 String으로 변환하는 가장 좋은 방법은 무엇입니까?
왜이 중 하나를 다른 것보다 선호해야합니까? 하나 더 잘 수행합니까?
답변:
C # 6부터 열거 형의 이름을 얻는 가장 좋은 방법은 새로운 nameof
연산자입니다.
nameof(MyEnum.EnumValue);
// Ouputs
> "EnumValue"
컴파일 타임에 열거 형이 컴파일 된 결과의 문자열로 바뀌어 작동하며, 이것이 가장 빠른 방법임을 의미합니다.
열거 형 이름의 난독 화가 가치 있거나 중요하다고 생각되면 열거 형 이름을 사용하면 코드 난독 화를 방해 할 수 있습니다. 이는 아마도 다른 질문 일 것입니다.
nameof(variableEnum)
것입니다 "variableEnum"
. 값이 아닌 필드 / 속성 / 매개 변수 / 변수 의 이름 을 (빌드 타임에) 반영 합니다 .
"someEnumValue"
당신이 필요로 할 때, nameof(SomeEnum.FooBar)
얻을 "FooBar"
.
우리 프로젝트를 위해 일하십시오 ...
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()
내부적으로는 모두라는 메소드를 호출 InternalGetValueAsString
합니다. 의 차이 ToString
와 GetName
그 것이다 GetName
먼저 몇 가지를 확인해야합니다 :
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 문을 사용하고 필요한 경우 이름을 국제화하십시오.
ToString()
가독성 관점에서 가장 확실한 결과를 제공 하지만 사용 Enum.GetName()
하려면 패턴을 항상 보지 않는 한 사용하려는 작업을 신속하게 이해하기 위해 약간 더 정신 분석이 필요합니다.
@nawfal의 답변에 이미 제공된 것처럼 순수한 성능 관점에서 Enum.GetName()
더 좋습니다.
성능이 실제로 목표라면 사전 또는 다른 매핑을 사용하여 미리 조회를 제공하는 것이 좋습니다.
C ++ / CLI에서는 다음과 같습니다.
Dictionary<String^, MyEnum> mapping;
for each (MyEnum field in Enum::GetValues(MyEnum::typeid))
{
mapping.Add(Enum::GetName(MyEnum::typeid), field);
}
100 개 항목과 1000000 회 반복의 열거 형을 사용한 비교 :
Enum.GetName : ~ 800ms
.ToString () : ~ 1600ms
사전 매핑 : ~ 250ms