变量 SET 函数中的 StackOverflowException

StackOverflowException in Variable SET function

我正在从头开始使用 C# 开发游戏引擎库。我首先制作了一个 class“Window”,它是 System.Window.Form 的一个实现,作为使用此引擎制作的 game/games 的主要 window .

创建代码后,我决定制作一个测试应用程序以查看 Window class 是否有效。但是,对于 Window class 中的项目,我一直在 setter 上收到 WhosebugException。请原谅错误的格式。无论出于何种原因,我都无法将它分成 3 个密码锁。我知道 WhosebugException 意味着 setter 运行 出栈以放置数据,但我不确定为什么。任何人都可以提供建议。谢谢。这是代码

Window.cs

namespace SharpGraphics
{
    internal class sgWindowParamiterModifiers
    {
        public bool sgWindowVisible { get => sgWindowVisible; set => sgWindowVisible = value; }
        public bool sgWindowAlwaysOnTopLayer { get => sgWindowAlwaysOnTopLayer; set => sgWindowAlwaysOnTopLayer = value; }
        public bool sgWindowIsBorderless { get => sgWindowIsBorderless; set => sgWindowIsBorderless = value; }

        public sgWindowParamiterModifiers()
        {
            sgWindowVisible = false;
            sgWindowAlwaysOnTopLayer = false;
            sgWindowIsBorderless = false;
        }

    }
    public class Window : Form
    {
        internal static String sgWindowTitle { get => sgWindowTitle; set => sgWindowTitle = value; }
        internal static typedefs.coords SgWindowCoords { get; set; }

        internal sgWindowParamiterModifiers sgWindowParamiters { get => sgWindowParamiters; set => sgWindowParamiters = value; }

        internal Color sgWindowColor { get => sgWindowColor; set => sgWindowColor = value; }

        internal Window(string windowTitle, typedefs.coords coords, sgWindowParamiterModifiers windowParamiters,
            Color windowColor)
        {
            sgWindowTitle = windowTitle;
            SgWindowCoords = coords;
            sgWindowParamiters = windowParamiters;
            sgWindowColor = windowColor;
        }

        public static bool sgCreateWindow(Window window)
        {
            bool sgWindowCreateSuccess = false;

            window.Visible = window.sgWindowParamiters.sgWindowVisible;
            
            //This is temporary. will add function to use alternative border layouts later
            //
            window.FormBorderStyle = (window.sgWindowParamiters.sgWindowIsBorderless ? FormBorderStyle.None : FormBorderStyle.Fixed3D);

            window.TopMost = window.sgWindowParamiters.sgWindowAlwaysOnTopLayer;

            try
            {
                window.Show();
            }
            catch(Exception Ex)
            {
                MessageBox.Show("The window failed to generate during function: SharpGraphics.Window.sgGenerateWindow()"
                    + Environment.NewLine + "The following is the internal error information:" + Environment.NewLine +
                    Ex.Message + Environment.NewLine + Ex.StackTrace, "Fatal Error 0xC0000002 - SG_WINDOW_FAILED_GENERATION_EXCEPTION",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(Ex.HResult);
            }

            sgWindowCreateSuccess = true;

            return sgWindowCreateSuccess;
        }
    }
}
'''


----------


//"coords" class from typedefs.cs
'''
  public class coords
        {
            public int X { get => X; set => X = value; } \ <--- Whosebug on X.set

            public int Y { get => Y; set => Y = value; }

            public coords(int x, int y)
            {
                X = x;
                Y = y;
            }
        }
'''


----------

//unit test from /test/testWindow.cs
'''
namespace SharpGraphics.test
{
    class windowTest
    {

        public static void Main(String[] args)
        {
            Window window = new Window("SharpGraphics Test Window", new typedefs.coords(1024, 768),
                new sgWindowParamiterModifiers(), Color.White);

            window.sgWindowParamiters.sgWindowVisible = true;

            Window.sgCreateWindow(window);

            return;

        }
    }
}
'''

您不应该在它们自己的 getter 或 setter 中分别使用属性 getters/setters,这基本上是导致 Whosebug 的原因。在这段代码中:

public int X { get => X; set => X = value; } \ <--- Whosebug on X.set 

当您尝试在内部设置 X 属性 时,它会递归调用它自己的 setter,这又会再次调用它...等等,直到您 运行 出栈 space.

修复它的一种方法 - 只需将所有这些定义更改为普通 auto-implemented properties:

public int X { get; set; } 

想一想你在写什么,看看 C# 中的 property 是什么。更具体地说,setter.

因为你没有在你的 getters/setters 中做任何逻辑,我说删除你在其中的所有代码,并使用 auto-属性 语法:

public Type PropertyName { get; set; }

这将满足您的所有需求。

为了解释您的 WhosebugException 原因,您的 X setter 看起来像这样:

public int X {get => X; set => X = value; }

基本上编译为:

public int get_X() { return get_x(); }
public void set_X(int value) { set_x(value); }

当你写 coords.X = 5; 时,你实际上做 coords.set_x(5); 会导致无限递归和 WhosebugException.