属性setter中出现StackOverflow异常

本文关键字:StackOverflow 异常 setter 属性 | 更新日期: 2023-09-27 18:21:56

我是编程新手,目前正在学习C#课程。我被这几周的任务弄糊涂了。这是我的任务:

创建一个包含类"Distance"的文件。内部距离保持在1/64英寸的精度。

Distance必须有一个专用的无符号整数变量"SixtyFourths",该整数的确切值应该是Distance所代表的英寸的1/64。

创建一个属性"Inches"以获取和设置以英寸为单位的双倍值的Distance。

创建一个特性"Feet"以获取和设置以英尺为单位的双倍值的"Distance"。

创建一个特性"米",以获取和设置以米为单位的双倍值的"距离"。

创建一个属性"FtInFraction"以获取字符串形式的当前距离,或者设置与字符串的距离,您必须使用的字符串格式如下所示。

根据需要编写私有方法来完成所需的工作。只有属性和构造函数可以是公共的。

将浮点值转换为整数时,请确保使用正确的舍入规则。

用"main"写一个简短的程序。内部干线:

创建由类定义的对象"距离"的实例。

距离演示=新距离();Demo.Feet=1.1;string FeetInchesFraction=Demo.FtInFraction;//应为:"1'1 13/64"Demo.FtInFraction="3'3 3/8";Double Meters=Demo.Meters;//由于的舍入,将为1.00125米

使用控制台输出的屏幕截图进行详尽的测试。详尽的测试通过数千种可能性来验证FtInFraction在所有情况下都会生成和解释字符串值。这很容易通过循环来完成。

以下是我迄今为止为该类编写的代码:

namespace Measurement_Converter
{
    class Distance
    {
        public double Meters
        {
            get
            {
                return Meters;
            }
            set
            {
                Meters = 0;
            }
        }
        // Feet 
        public double Feet
        {
            get
            {
                return Meters / .30480;
            }
            set
            {
                Meters = value * 3.34375;
            }
        }
        public string FeetString
        {
            get
            {
                StringBuilder SB = new StringBuilder();
                return SB.ToString();
            }
            set
            {
                string raw = value;
            }
        }
        // Inches
        private int SixtyFourths;
        public double Inches
        {
            get
            {
                return SixtyFourths;
            }
            set
            {
                SixtyFourths = 0;
                if (value % 2 == 0)
                    return;
                SixtyFourths = (int)(value / 2);
            }
        }
        public double FtInFraction
        {
            get
            {
                return FtInFraction;
            }
            set
            {
            }
        }
    }
}

这是我为main编写的代码:

namespace Measurement_Converter
{
    class Program
    {
        static void Main(string[] args)
        {
            Distance T = new Distance();
            T.Meters = 12;
            string Test = T.FeetString;
        }
    }
}

我现在的问题是,在我的米课的设置部分,我遇到了堆叠失败。我肯定会遇到的问题是由于我缺乏经验。我希望有人能帮助我理解堆栈溢出错误,并可能帮助我了解程序的其余部分可能需要做什么,或者至少有一个类似的例子,我可以用它来理解这种外语。此外,我明白了任务的要点,但如果有人能用外行的话解释测试部分的话。我不想有人替我做工作,但这项任务让我很困惑,这让我很沮丧。

属性setter中出现StackOverflow异常

您的Metres属性与后备字段(变量)同名,并且正在递归调用。您可能对自动属性与自己声明"backing"字段感到困惑。

你可以这样实现:

class Distance 
{
    private double _meters;
    public double Meters
    {
        get
        {
            return _meters;
        }
        set
        {
            _metres = value;
        }
    }
    .....

或者像这样:

class Distance 
{
      public double Metres{ get; set; }
      ....

参考:自动实现属性