在visual studio中,当应用程序在调试模式下停止时,您可以将鼠标悬停在对象/属性上以查看其中的内容。
当您使用调试器打开对象时,就像我在上面的图片中所做的那样,该属性将调用Get方法作为调试器检索属性值以显示用户的方式。
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo();
foo.MyLock.EnterWriteLock();
foo.Bar = 5.1;
foo.MyLock.ExitWriteLock();
// "I stop here and attempt to see what the value of Bar is via the debugger."
foo.MyLock.EnterReadLock();
Console.WriteLine(foo.Bar);
foo.MyLock.ExitReadLock();
}
}
class Foo
{
private double bar;
public double Bar
{
get
{
Console.WriteLine(MyLock.IsReadLockHeld);
Debug.Assert(MyLock.IsReadLockHeld, "Please enter the read lock before attempting to read this property.");
return bar;
}
set
{
Debug.Assert(MyLock.IsWriteLockHeld, "Please enter the write lock before attempting to write this property.");
bar = value;
}
}
public ReaderWriterLockSlim MyLock { get; set; }
public Foo()
{
MyLock = new ReaderWriterLockSlim();
}
}
在我的应用程序中,我将Debug.Assert()调用添加到我的Get访问器中,以确保此示例中的Foo已被锁定。每当我的代码调用Bar时,foo应该按照设计被锁定,但是当调试器试图查看bar时,foo将不会被锁定,这意味着断言应该失败。
当调试器遇到失败的断言时,它有时会抑制断言弹出窗口,有时它会根据正常失败的断言行为显示断言弹出窗口。尽管我可以告诉Assert弹出窗口似乎被抑制了前1-2次调试器查看Bar的值但是每次在前1-2之后弹出窗口都被允许显示。虽然这是断言抑制的最常见行为,但情况并非总是如此,因为在应用程序的其他运行中,无论调试器查看Bar多少次,调试器都不会停止抑制。
问题:对于我的应用程序,所需的行为是100%的时间抑制断言。我该如何实现这一目标?
修改 此外,如果它在调试器遇到其中一个断言时有帮助,并且它失败了以下消息,它就会写入Debug输出。无论断言是否被抑制,这都是完全相同的消息。
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
Please enter the read lock before attempting to read this property.
---- Assert Long Message ----
at TestApp_Debugging.Foo.get_Bar() in c:\Users\Adrian.vanBerkhout\Documents\Visual Studio 2013\Projects\TestApp_Debugging\TestApp_Debugging\Program.cs:line 37
at TestApp_Debugging.Program.Main(String[] args) in c:\Users\Adrian.vanBerkhout\Documents\Visual Studio 2013\Projects\TestApp_Debugging\TestApp_Debugging\Program.cs:line 17
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:3)
我找到了解决方案here。使用DebuggerBrowsable属性装饰您的问题属性。
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
理想情况下,您永远不需要这样做。但是,我们有一些属性在评估时(在调试中)触发代码契约异常,这会导致Visual Studio变得非常混乱。您可能需要修饰类及其实现的任何接口上的属性。