【问题标题】:StackOverflowException in property setter [duplicate]属性设置器中的 StackOverflowException [重复]
【发布时间】:2014-09-14 09:27:32
【问题描述】:

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

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

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

创建一个“英寸”属性以获取和设置与双精度值的距离(以英寸为单位)。

创建一个属性“Feet”以获取和设置与双精度值的距离(以英尺为单位)。

创建一个属性“Meters”以获取和设置与以米为单位的双精度值的距离。

创建属性“FtInFraction”以字符串形式获取当前距离,或者设置与字符串的距离,下面指定必须使用的字符串格式。

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

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

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

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

距离演示 = new Distance(); Demo.Feet = 1.1;字符串 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
            {

            }
        }
    }
}

这是我为 main 编写的代码:

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

            T.Meters = 12;

            string Test = T.FeetString;
        }
    }
}

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

【问题讨论】:

    标签: c# properties stack-overflow


    【解决方案1】:

    您的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

    【讨论】:

    • 而蹩脚的反对票是因为?
    • 感谢米奇的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2012-10-09
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多