Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parse()或new Guid()-什么';有什么区别?_C#_.net_Guid - Fatal编程技术网

C# Parse()或new Guid()-什么';有什么区别?

C# Parse()或new Guid()-什么';有什么区别?,c#,.net,guid,C#,.net,Guid,这两种将字符串转换为System.Guid的方法有什么区别?有理由选择其中一个而不是另一个吗 var myguid = Guid.Parse("9546482E-887A-4CAB-A403-AD9C326FFDA5"); 或 我会选择TryParse。它不会引发异常。快速查看反射器,可以发现两者几乎相同 public Guid(string g) { if (g == null) { throw new ArgumentNullException("g");

这两种将字符串转换为
System.Guid
的方法有什么区别?有理由选择其中一个而不是另一个吗

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


我会选择
TryParse
。它不会引发异常。

快速查看反射器,可以发现两者几乎相同

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;
}

使用您最容易阅读的版本。这两者的实现方式几乎完全相同

唯一真正的区别是构造函数在尝试解析之前将自身初始化为
Guid.Empty
。然而,有效代码是相同的


也就是说,如果
Guid
来自用户输入,那么
Guid.TryParse
将比这两个选项都好。如果这个
Guid
是硬编码的,并且总是有效的,那么上面的任何一个都是完全合理的选择。

我在一百万个Guid和Guid上尝试了性能。解析似乎要快得多。它使我的电脑上的总创作时间相差10-20毫秒,即800毫秒

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);
    }
}
公共类程序
{
公共静态void Main()
{
常数int迭代=1000*1000;
常量字符串输入=“63559BC0-1FEF-4158-968E-AE4B94974F8E”;
var sw=Stopwatch.StartNew();
对于(var i=0;i
和输出:

新Guid():804毫秒


Guid.Parse():791 ms在.Net framework v1.1中只存在一种方式->var myguid=new Guid(“9546482E-887A-4CAB-A403-AD9C326FFDA5”)


Guel.PARSE稍后可用。

在什么方面?您也可以使用:GUID.TyPARSESER(),我不认为这是一个原因。有些场景需要异常,有些场景不需要。更重要的是根据场景选择合适的方法。+1对于可能有空字符串的db,这是一种解析guid并获取guid的简单方法。如果字符串为空,则为空。我也同意@DirkVollmar的观点,即这是一种糟糕的推理。一直使用
TryParse
会导致大量问题和无效的代码路径。当您知道值应该是
Guid
时,最好使用
Parse
,如果不是,则快速失败,而不是尝试处理完全无效的场景,使代码更加复杂和脆弱。感谢您的回复。我真的在寻找“它们在工作方式上是否存在差异”。看起来在使用的GuidParseThrowStyle中有明显的差异,因此一个可以为输入抛出一个错误,而另一个不会。@Triynko:如果你看代码,你会发现它们都是出于相同的原因抛出的。唯一的区别是,如果抛出
OverflowException
,在
Guid.Parse
的情况下,它将被封装在
FormatException
中。这不是一个统计上显著的基准。我运行了多次,得到了不同的结果。背景噪音掩盖了这些实现中任何可能的性能差异。请提供一个解释和解决方案,以便用户更好地理解代码正在做什么。
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);
    }
}