【发布时间】:2010-09-11 09:59:03
【问题描述】:
我想尝试将字符串转换为 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 Namespace extensions can be specified by appending a GUID to a folder name。我可能正在解析文件夹名称,检查最后 . 之后的文本是否是 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
附言我不应该为一个问题辩护。
【问题讨论】:
-
为什么这是一个社区维基?
-
你是对的;您应该不必须证明一个问题的合理性。但是,我感兴趣地阅读了理由(因为它与我在这里阅读本文的原因非常相似)。所以,谢谢你的充分理由。
-
@Jeff 可能是因为 OP 已对其进行了 10 多次编辑 - 请参阅 meta on community wiki
-
请继续在此页面上查找使用 Guid.TryParse 或 Guid.TryParseExact 的解决方案。使用 .NET 4.0 + 上述解决方案并不是最优雅的
-
@dplante 当我最初在 2008 年问这个问题时,没有
4.0。这就是为什么问题和公认的答案是这样的原因。