VisualStudio 在 DebuggerDisplay 的屬性更改業務邏輯將會讓調試和非調試下邏輯不一樣

本文記錄我寫的逗比代碼,我在 DebuggerDisplay 對應的屬性的 get 方法上,在這個方法裏面修改了業務邏輯,如修改界面元素,此時我在 VisualStudio 斷點調試下和非斷點調試下的行爲不相同git

在 VisualStudio 調試器進入斷點,默認開啓隱函數求值,將會自動調用對應的類型的 DebuggerDisplay 特性裏面說明的輸出方法,若是對應的對象沒有定義 DebuggerDisplay 特性,默認將會調用 ToString 方法。不管是在 DebuggerDisplay 特性仍是在 ToString 方法裏面編寫變動業務邏輯的代碼,都會讓在斷點調試下和非斷點調試下的行爲不相同github

如如下代碼,個人 xaml 界面以下express

<Window x:Class="NearberjalnodarGahayjekuqi.MainWindow"
          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>

接下來在後臺代碼添加一個屬性,用來在調試時輸出async

public string Debug
        {
            get
            {
                StackPanel.Children.Add(new TextBlock()
                {
                    Text = "123"
                });
                return "Foo";
            }
        }

在 MainWindow 添加 DebuggerDisplay 特性,代碼以下函數

[DebuggerDisplay("{" + nameof(Debug) + "}")]
    public partial class MainWindow : Window
    {

    }

再寫一點代碼,用來添加斷點spa

[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 調試調用3d

而若是在 get 方法編寫業務邏輯,那麼調用 get 的次數將會和斷點進入次數相關,或和具體獲取屬性的次數相關調試

更多的代碼細節還請到 githubgitee 上閱讀代碼code

能夠經過以下方式獲取本文的源代碼,先建立一個空文件夾,接着使用命令行 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 文件夾

相關文章
相關標籤/搜索