我想尝试将字符串转换为 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-I我来预测错误数据的原因。
例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个好的引导者和10,000个坏的引导者。
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
另外,我不需要为一个问题辩护。