C#实现Vector3类时归一化向量触发栈溢出异常求助
问题原因
栈溢出是因为构造函数无限递归:你在Vector3的构造函数里创建normalized实例时,会再次调用Vector3的构造函数,这个新实例的构造函数又会创建自己的normalized,循环往复直到栈被耗尽。
修正实现方案
把magnitude和normalized改成只读属性,按需计算而非在构造时预先生成,同时处理向量长度为0的边界情况(避免除以0错误):
namespace Vector3 { internal class Program { static void Main(string[] args) { Vector3 vector = new(3, 4, 0); Console.WriteLine(vector.Magnitude); Console.WriteLine(vector.Normalized); } } class Vector3 { public float X, Y, Z; // 只读属性,按需计算模长 public float Magnitude { get { return MathF.Sqrt(X * X + Y * Y + Z * Z); } } // 只读属性,按需计算归一化向量 public Vector3 Normalized { get { float mag = Magnitude; // 处理模长接近0的情况,避免除以0 if (mag < 1e-6f) { return new Vector3(0, 0, 0); } return new Vector3(X / mag, Y / mag, Z / mag); } } public Vector3(float x, float y, float z) { X = x; Y = y; Z = z; } // 重写ToString方便输出向量内容 public override string ToString() { return $"({X:F2}, {Y:F2}, {Z:F2})"; } } }
关键细节说明
- 用
MathF代替Math和Convert.ToSingle,直接操作float类型,更高效简洁。 Normalized属性里判断模长是否小于极小值(1e-6f),避免因浮点精度问题导致的除以0异常。- 去掉了构造函数中对
magnitude和normalized的初始化,彻底避免递归调用。
内容的提问来源于stack exchange,提问作者Woul
相关产品推荐
相关产品推荐

