设置函数忽略if语句 - 如果输入小于或等于0,则应返回0

时间:2017-10-02 02:38:12

标签: c# if-statement

我有一个非常简单的任务,在C#中使用get和set函数/方法(不确定你叫它)来返回某个范围内的值。如果输入值小于或等于0,则返回值应为0,如果输入值大于或等于100,则应返回100. 0到100之间的所有输入值都直接返回,因为它们是。

问题是如果我输入一个负数作为我的输入,它不会将其更改为零。有趣的是我的最大功能正常工作,即使它与我的最小功能正好相反。

有人可以告诉我为什么我的第一个if语句没有将负值更改为零?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RangeRestrictedInteger
{
    public class RangedInteger
    {
        int minimum;
        int maximum;
        int valueReturn;

        public RangedInteger(int min, int max)
        {
            minimum = min;
            maximum = max;
        }

        public int Value
        {
            get
            {
                return valueReturn;
            }
            set
            {
                if (value <= minimum)
                {
                    valueReturn = minimum;
                }
                if (value >= maximum)
                {
                    valueReturn = maximum;
                }
                else
                {
                    valueReturn = value;
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            RangedInteger myInteger = new RangedInteger(0, 100);
            myInteger.Value = 57;
            Console.WriteLine("{0}", myInteger.Value); // Should be 57
            myInteger.Value = 103;
            Console.WriteLine("{0}", myInteger.Value); // Should be 100
            myInteger.Value = -4;
            Console.WriteLine("{0}", myInteger.Value); // Should be 0

            Console.WriteLine("\nPress enter to exit.");
            Console.ReadLine();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这是因为您的第一个和第二个if不是独占的:即使第一个else被执行,第二个if的最终if也会被执行。

添加额外的else来解决此问题:

if (value <= minimum)
{
    valueReturn = minimum;
}
else if (value >= maximum)
{
    valueReturn = maximum;
}
else
{
    valueReturn = value;
}

请注意,您可以使用Math.MinMath.Max

完全避免此问题
set {
    valueReturn = Math.Min(Math.Max(value, minimum), maximum);
}

Demo.