我希望尝试将一个字符串转换为Guid,但是我不想依赖于捕获异常(
- 出于性能原因- 异常开销很大
- 为了易用性- 调试器会弹出
- 出于设计原因- 预期结果不是异常情况
换句话说,以下代码:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
不适合使用。
我会尝试使用正则表达式,但由于guid可能是括号包裹、大括号包裹或未包裹的形式,这使得它很难匹配。
另外,我认为某些Guid值是无效的(?)
更新1
ChristianK提出了一个很好的想法,只捕获FormatException
而不是所有异常。修改问题的代码示例以包含此建议。
更新2
为什么要担心抛出的异常?我真的经常遇到无效的GUID吗?
答案是是的。这就是我使用TryStrToGuid的原因-我预计数据有问题。
示例1命名空间扩展可以通过在文件夹名称后附加GUID来指定。我可能正在解析文件夹名称,检查最终 .之后的文本是否是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:我可能正在运行一个使用频率很高的Web服务器,想要检查一些发送回来的数据的有效性。我不希望无效的数据占用的资源比它需要的高出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
p.s. 我不应该为一个问题辩解。
4.0
。这就是为什么问题和被接受的答案是它们现在的样子的原因。 - Ian Boyd