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