本文記錄我寫的逗比代碼,我在 DebuggerDisplay 對應的屬性的 get 方法上,在這個方法里面修改了業務邏輯,如修改界面元素,此時我在 VisualStudio 斷點除錯下和非斷點除錯下的行為不相同
在 VisualStudio 除錯器進入斷點,默認開啟隱函式求值,將會自動呼叫對應的型別的 DebuggerDisplay 特性里面說明的輸出方法,如果對應的物件沒有定義 DebuggerDisplay 特性,默認將會呼叫 ToString 方法,無論是在 DebuggerDisplay 特性還是在 ToString 方法里面撰寫變更業務邏輯的代碼,都會讓在斷點除錯下和非斷點除錯下的行為不相同
如以下代碼,我的 xaml 界面如下
<Window x:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NearberjalnodarGahayjekuqi"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel x:Name="StackPanel">
</StackPanel>
</Grid>
</Window>
接下來在后臺代碼添加一個屬性,用來在除錯時輸出
public string Debug
{
get
{
StackPanel.Children.Add(new TextBlock()
{
Text = "123"
});
return "Foo";
}
}
在 MainWindow 添加 DebuggerDisplay 特性,代碼如下
[DebuggerDisplay("{" + nameof(Debug) + "}")]
public partial class MainWindow : Window
{
}
再寫一點代碼,用來添加斷點
[DebuggerDisplay("{" + nameof(Debug) + "}")]
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Foo();
}
private async void Foo()
{
while (true)
{
await Task.Delay(1000);
}
}
public string Debug
{
get
{
StackPanel.Children.Add(new TextBlock()
{
Text = "123"
});
return "Foo";
}
}
}
在 Foo 方法里面加上斷點,此時可以看到,在進入斷點時,將會讓界面添加 TextBlock 元素,如果沒有進入斷點將不會修改界面
這是因為在 DebuggerDisplay 特性里面,將會輸出被花括號包含的屬性名對應的屬性的值,也就是對應的屬性的 get 方法將會在 VisualStudio 除錯呼叫
而如果在 get 方法撰寫業務邏輯,那么呼叫 get 的次數將會和斷點進入次數相關,或和具體獲取屬性的次數相關
更多的代碼細節還請到 github 或 gitee 上閱讀代碼
可以通過如下方式獲取本文的源代碼,先創建一個空檔案夾,接著使用命令列 cd 命令進入此空檔案夾,在命令列里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 8b7af3786fd9544edeb8213d23f699938d75eb44
以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
獲取代碼之后,進入 NearberjalnodarGahayjekuqi 檔案夾
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/288013.html
標籤:.NET技术
