变量 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
.
我正在从头开始使用 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
.