属性setter中的StackOverflowException

时间:2014-09-14 01:09:05

标签: c# properties stack-overflow

我是编程新手,目前正在参加C#课程。这周的任务让我迷失了。这是我的任务:

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

距离必须有一个私有无符号整数变量“SixtyFourths”,这个整数的确切值应该是距离所代表的1/64英寸的数量。

创建一个属性“Inches”以获取并设置距离为双倍的英寸距离。

创建一个属性“Feet”来获取和设置距离的双倍值。

创建属性“Meters”以获取并设置距离为米的双倍值。

创建属性“FtInFraction”以将当前距离作为字符串获取,或者设置与字符串的距离,您必须使用的字符串格式如下所示。

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

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

在“main”中写一个简短的程序。内部主要:

创建由您的班级定义的对象距离的实例。

距离演示=新距离(); Demo.Feet = 1.1; string FeetInchesFraction = Demo.FtInFraction; //应该是:“1'1 13/64”“Demo.FtInFraction =”3'3 3/8“”;双米= 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
            {

            }
        }
    }
}

以下是我为主要编写的代码:

namespace Measurement_Converter
{
    class Program
    {
        static void Main(string[] args)
        {
            Distance T = new Distance();

            T.Meters = 12;

            string Test = T.FeetString;
        }
    }
}

我目前的问题是我在我的米类的设置部分得到了stackoverflowexception。我肯定会遇到的问题是由于我缺乏经验。我希望有人可以帮助我理解堆栈溢出错误,并可能帮助我了解我可能需要对程序的其余部分做什么,或者至少是一个类似的例子,我可以用它来试图理解这个外语。此外,我得到了作业的要点,但如果有人可以尝试用外行的术语解释测试部分。我不希望别人为我做我的工作,但这项任务对我来说非常困惑,这让我感到非常沮丧。

1 个答案:

答案 0 :(得分:5)

您的Metres属性与支持字段(变量)具有相同的名称,并且正在递归调用。您可能会对自动属性感到困惑,而不是宣布支持'现场自己。

你可以这样实现:

class Distance 
{
    private double _meters;

    public double Meters
    {
        get
        {
            return _meters;
        }
        set
        {
            _metres = value;
        }
    }

    .....

或者像这样:

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

      ....

参考:Auto-Implemented Properties