SSIS VSTA脚本组件调试器使用字典TryGetValue时无法启动问题
处理VSTA调试器的两类启动失败Bug
我之前也碰到过VSTA调试器这些恼人的问题,给你整理下已知的解决方案和当前的困境:
1. 字符串插值导致调试器无法启动
VSTA调试器对C#的字符串插值语法支持存在Bug,一旦代码里用了类似$"Hello {name}"的写法,调试器就直接卡壳启动不了。
- 临时缓解方案:把所有字符串插值替换成
String.Format()方法,比如把$"User: {userId}"改成String.Format("User: {0}", userId),这样调试器就能正常启动了。
2. 字典TryGetValue()方法引发的启动失败
这是个更棘手的问题,当代码里使用字典的TryGetValue()方法时,调试器同样无法启动,比如你这段代码:
foreach (string strMemberDn in varGroupMemberDns) {
if (dctObjectGuidDn.TryGetValue(strMemberDn, out Guid gidMemberGuid)) {
lstGroupMemberGuid....
}
}
目前我还没找到完美的官方修复方案,但可以试试几个临时的替代思路:
- 替代方案1:先检查键是否存在再取值
把TryGetValue()拆分成两步:先判断字典是否包含目标键,再通过索引器取值,代码改成这样:
虽然这种写法在键不存在时会抛出异常(但你本来就是判断存在才取值,所以逻辑上是安全的),但能避开调试器的这个Bug。foreach (string strMemberDn in varGroupMemberDns) { if (dctObjectGuidDn.ContainsKey(strMemberDn)) { Guid gidMemberGuid = dctObjectGuidDn[strMemberDn]; lstGroupMemberGuid.... } } - 替代方案2:使用LINQ的
FirstOrDefault()
如果你的字典值类型是可空的(或者可以接受默认值),也可以用LINQ来间接获取值:
注意这种写法的性能比foreach (string strMemberDn in varGroupMemberDns) { var memberGuid = dctObjectGuidDn.FirstOrDefault(kvp => kvp.Key == strMemberDn).Value; if (memberGuid != default(Guid)) { lstGroupMemberGuid.... } }TryGetValue()差一些,数据量小的时候可以忽略,大数据量场景谨慎使用。
目前VSTA官方似乎还没针对这个TryGetValue()的Bug发布修复补丁,所以只能先用这些替代方案绕开问题。
内容的提问来源于stack exchange,提问作者J Weezy
相关产品推荐
相关产品推荐

