我想尝试将字符串转换为Guid,但是我不想依赖于捕获异常(
- 出于性能原因-异常代价高昂
- 出于可用性原因-调试器弹出
- 出于设计原因-预期并非例外
换句话说,代码:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
不适合。
我会尝试使用RegEx,但是由于guid可以用括号括起来,括号括起来,没有任何包裹,因此很难。
另外,我认为某些Guid值无效(?)
更新1
ChristianK有个好主意,那就是只抓FormatException
,而不是全部。更改了问题的代码示例以包含建议。
更新2
为什么要担心引发异常?我真的经常会遇到无效的GUID吗?
答案是肯定的。这就是为什么我使用TryStrToGuid -我很期待坏数据。
示例1 可以通过将GUID附加到文件夹名称来指定名称空间扩展名。我可能正在解析文件夹名称,检查是否在final后面的文本。是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
ps我不必证明一个问题。
4.0
。这就是为什么问题和被接受的答案都是这样。