DebuggerHidden
非常方便,可以标记辅助方法,确保未处理的异常在方便的位置停止调试器:
in
作为当前语句)。虽然这显然是Visual Studio的限制(我已经提交了报告),但是否有一种方法可以解决这个问题,同时仍然使用迭代器块?
我猜这是因为编译器生成的实现迭代器的代码没有标记为
[DebuggerHidden]
。也许有一些方法可以说服编译器这样做?DebuggerHidden
非常方便,可以标记辅助方法,确保未处理的异常在方便的位置停止调试器:
in
作为当前语句)。[DebuggerHidden]
。也许有一些方法可以说服编译器这样做?或许不是你期望的答案,但这个解决方法可以获得一些分数……不确定你是否已经想到了这个方法。
创建一个辅助类来取消包装迭代器,然后使用扩展方法将包装器应用于迭代器。我处理异常并重新抛出。在VS2010中,我必须奇怪地取消调试选项“仅启用我的代码”,以获得接近OP所要求的行为。如果保留选项,则仍会进入实际的迭代器,但看起来多了一行。
这使得此答案更像是一个实验,旨在证明和支持需要更好的编译器支持才能使情境正常工作。
扩展方法辅助类:
public static class HiddenHelper
{
public static HiddenEnumerator<T> Hide<T>(this IEnumerable<T> enu )
{
return HiddenEnumerator<T>.Enumerable(enu);
}
}
包装器:
public class HiddenEnumerator<T> : IEnumerable<T>, IEnumerator<T>
{
IEnumerator<T> _actual;
private HiddenEnumerator(IEnumerable<T> enu)
{
_actual = enu.GetEnumerator();
}
public static HiddenEnumerator<T> Enumerable(IEnumerable<T> enu )
{
return new HiddenEnumerator<T>(enu);
}
public T Current
{
[DebuggerHidden]
get
{
T someThing = default(T);
try
{
someThing = _actual.Current;
}
catch
{
throw new Exception();
}
return someThing;
}
}
public IEnumerator<T> GetEnumerator()
{
return this;
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public void Dispose()
{
_actual.Dispose();
}
object IEnumerator.Current
{
get { return _actual.Current; }
}
[DebuggerHidden]
public bool MoveNext()
{
bool move = false;
try
{
move = _actual.MoveNext();
}
catch
{
throw new IndexOutOfRangeException();
}
return move;
}
public void Reset()
{
_actual.Reset();
}
}
使用方法:
public IEnumerable<int> Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
if (result>Int16.MaxValue) throw new Exception();
result = result * number;
yield return result;
}
}
public void UseIt()
{
foreach(var i in Power(Int32.MaxValue-1,5).Hide())
{
Debug.WriteLine(i);
}
}
Hide
。 - Roman Starkov
PerformQuery
方法,如果参数不合理就会抛出异常。它只在我们团队内部使用。这个异常没有被捕获,因为这是一个调试版本,特别避免捕获异常,只是为了让Visual Studio停在恰当的位置。如果项目只是关闭并显示一个通用的“出现问题”消息,那么这只会使调试变得更加困难。我们知道有一个bug,最好停在恰当的行! - Roman Starkov