Guid.Parse () 또는 new Guid ()-차이점은 무엇입니까?


79

문자열을 변환하는이 두 가지 방법의 차이점은 무엇입니까 System.Guid? 하나를 선택해야하는 이유가 있습니까?

var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5");

또는

var myguid = new Guid("9546482E-887A-4CAB-A403-AD9C326FFDA5");

6
무엇의 관점에서?
raym0nd

4
다음을 사용할 수도 있습니다. Guid.TryParse ()
Patrick Desjardins

답변:


90

Reflector를 빠르게 살펴보면 둘 다 거의 동일하다는 것을 알 수 있습니다.

public Guid(string g)
{
    if (g == null)
    {
       throw new ArgumentNullException("g");
    }
    this = Empty;
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.All);
    if (!TryParseGuid(g, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    this = result.parsedGuid;
}

public static Guid Parse(string input)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    GuidResult result = new GuidResult();
    result.Init(GuidParseThrowStyle.AllButOverflow);
    if (!TryParseGuid(input, GuidStyles.Any, ref result))
    {
        throw result.GetGuidParseException();
    }
    return result.parsedGuid;
}

응답 해 주셔서 감사합니다. 나는 정말로 "그들의 작동 방식의 차이"를 찾고있었습니다.
brennazoon 2011-08-02

사용 된 GuidParseThrowStyle에 분명한 차이가있는 것처럼 보이므로 하나는 입력에 대해 다른 하나는하지 않을 오류를 던질 수 있습니다.
Triynko 2017

3
@Triynko : 코드를 보면 둘 다 같은 원인에 대해 던지는 것을 볼 수 있습니다. 유일한 차이점은 an OverflowException이 던져 지면의 FormatException경우에 캡슐화된다는 것 입니다 Guid.Parse.
Luca Cremonesi

25

가장 읽기 쉬운 버전을 사용하십시오. 둘은 거의 동일한 방식으로 구현됩니다.

유일한 실제 차이점은 생성자 Guid.Empty가 구문 분석을 시도 하기 전에 자체적으로 초기화된다는 것 입니다. 그러나 효과적인 코드는 동일합니다.

즉, Guid사용자 입력에서 오는 Guid.TryParse경우 두 옵션보다 낫습니다. 이것이 Guid하드 코딩되고 항상 유효한 경우 위의 두 가지 중 하나가 완벽하게 합리적인 옵션입니다.


13

1 백만 개의 guid와 Guid에서 성능을 시도했습니다 .Parse는 상당히 빠른 것 같습니다. 내 PC에서 총 생성 시간이 800 밀리 초라는 10-20 밀리 초 차이를 만들었습니다.

public class Program
{
    public static void Main()
    {
        const int iterations = 1000 * 1000;
        const string input = "63559BC0-1FEF-4158-968E-AE4B94974F8E";

        var sw = Stopwatch.StartNew();
        for (var i = 0; i < iterations; i++)
        {
            new Guid(input);
        }
        sw.Stop();

        Console.WriteLine("new Guid(): {0} ms", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (var i = 0; i < iterations; i++)
        {
            Guid.Parse(input);
        }
        sw.Stop();

        Console.WriteLine("Guid.Parse(): {0} ms", sw.ElapsedMilliseconds);
    }
}

그리고 출력 :

새로운 Guid () : 804ms

Guid. Parse () : 791ms


3
이것은 통계적으로 유의미한 벤치 마크가 아닙니다. 나는 이것을 여러 번 실행했고 다양한 결과를 얻었습니다. 배경 소음은 이러한 구현에서 가능한 성능 차이를 흐리게합니다.
Brad M

1

나는 함께 갈 것이다 TryParse. 예외가 발생하지 않습니다.


29
나는 그 이유를 그렇게 생각하지 않을 것입니다. 예외를 원하는 시나리오와 원하지 않는 시나리오가 있습니다. 시나리오에 따라 적절한 방법을 선택하는 것이 더 중요합니다.
Dirk Vollmar 2011-08-02

빈 문자열이있을 수있는 db로 +1하면 guid를 구문 분석하고 문자열이 비어있는 경우 Guid.Empty를 얻는 쉬운 방법입니다.
ashes999

나는 또한 이것이 잘못된 추론이라는 @DirkVollmar에 동의합니다. TryParse항상 사용하면 엄청난 문제와 잘못된 코드 경로가 발생합니다. 완전히 잘못된 시나리오를 처리하고 코드를 더 복잡하고 취약하게 만드는 것보다 Parse값이 a Guid이고 그렇지 않은 경우 빠르게 실패 한다는 것을 알고있을 때 사용하는 것이 좋습니다 .
julealgon

-1

.Net 프레임 워크에서 v1.1은 한 가지 방법으로 만 존재합니다.-> var myguid = new Guid ( "9546482E-887A-4CAB-A403-AD9C326FFDA5");

Guid.Parse는 나중에 사용할 수있게되었습니다.


1
사용자가 코드가 수행하는 작업을 더 잘 이해할 수 있도록 솔루션과 함께 설명을 제공하십시오.
Andrew Reese
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.