문자열을 Guid로 변환하려고하지만 예외 잡기에 의존하고 싶지 않습니다 (
- 성능상의 이유로-예외는 비싸다
- 유용성으로 인해 디버거가 나타납니다.
- 디자인상의 이유로-예상되는 예외는 아닙니다
다른 말로하면 코드 :
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
적합하지 않습니다.
RegEx를 사용하려고 시도하지만 guid를 괄호로 묶거나 괄호로 묶을 수 있으며 랩핑을 할 수 없으므로 어렵게 만듭니다.
또한 특정 Guid 값이 유효하지 않다고 생각했습니다 (?)
업데이트 1
ChristianK 는 FormatException
모두가 아니라 잡는 것이 좋습니다 . 제안을 포함하도록 질문의 코드 샘플을 변경했습니다.
업데이트 2
예외 발생에 대해 왜 걱정해야합니까? 나는 종종 잘못된 GUID를 기대하고 있습니까?
대답은 ' 예' 입니다. 나는 - 나는 TryStrToGuid을 사용하고 이유입니다 하고 잘못된 데이터를 기대.
예 1 폴더 이름에 GUID를 추가하여 네임 스페이스 확장명을 지정할 수 있습니다 . 폴더 이름을 파싱하여 final 다음에 텍스트가 있는지 확인합니다 . GUID입니다.
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
예제 2 많이 사용하는 웹 서버를 실행 중일 수 있으며 일부 게시 된 데이터의 유효성을 확인하려고합니다. 필요한 것보다 2-3 배 큰 리소스를 묶는 잘못된 데이터를 원하지 않습니다.
예제 3 사용자가 입력 한 검색 표현식을 구문 분석하고있을 수 있습니다.
그들이 GUID에 들어가면 특별히 처리하고 싶습니다 (예 : 해당 객체 검색 또는 응답 텍스트에서 특정 검색어를 강조 표시하고 형식 지정).
업데이트 3-성능 벤치 마크
10,000 개의 좋은 Guid와 10,000 개의 나쁜 Guid를 변환하는 테스트.
Catch FormatException:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen with try-catch:
10,000 good: 637,633 ticks
10,000 bad: 717,894 ticks
COM Interop CLSIDFromString
10,000 good: 126,120 ticks
10,000 bad: 23,134 ticks
추신 : 나는 질문을 정당화 할 필요가 없습니다.
4.0
. 그렇기 때문에 질문과 받아 들여진 대답이 바로 그런 이유입니다.