You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:15:21