winforms 为什么在更改用户控件代码后生成应用程序时,应用程序会使整个visual studio崩溃?

50few1ms  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(140)

此链接中接受答案的原始用户控制代码:How to animate dots in UserControl Paint event?
我改变了它一点,并添加了一个选项来保存更改。所以我添加了一些用户设置属性,其中之一是SaveState:

[DefaultValue(false)]
        public bool SaveState
        {
            get => saveState;
            set
            {
                if (value)
                {
                    saveState = value;
                }

                Properties.Settings.Default.SaveState = value;
                Properties.Settings.Default.Save();
            }
        }

在构造函数中:

public LoadingLabel()
        {
            InitializeComponent();

            SaveState = Properties.Settings.Default.SaveState;
        }

问题是当i;我添加了另一行来更新SaveState整个应用程序和Visual Studio崩溃Visual Studio重新开始,而没有将控件拖到form 1设计器。崩溃发生在我进行更改之后,并在将控件拖到form 1设计器时。
这是我改变的:

[DefaultValue(false)]
        public bool SaveState
        {
            get => saveState;
            set
            {
                if (value)
                {
                    saveState = value;
                    SaveState = value;
                }

我又加了一句:

SaveState = value;

因为它正在更新saveState并且工作正常,但是从视觉上看,我没有看到属性SaveState发生变化:
SaveState被设置为true,但是当我将其更改为false时,只有当我移除控件并将其再次拖动到设计器时,才会看到它为false。

不确定在尝试更新SaveState时为什么会崩溃。

htzpubme

htzpubme1#

当你写

SaveState = value;

你叫二传手。
当您在setter的代码中这样做时,这将导致无限递归-您在setter中为SaveState赋值,这将调用setter,这将为SaveState赋值,这将调用setter,这将为SaveState赋值,这将调用setter,依此类推,直到永远,这将导致IDE崩溃。
故事的寓意:NEVER赋值给setter内部的属性;ALWAYS分配给支持字段。

相关问题