我使用set / get函数是否错误?

时间:2019-05-15 07:33:28

标签: c# class

我的程序中有一个与get / set函数有关的问题需要解决。

这里是完整的未编辑代码:https://pastebin.com/Vd8zC51m

编辑:我的好朋友找到了解决方案,就是这样使用“值”:

        {
            get
            {
                return this.returnValue;
            }

            set
            {
                if (value > 30)
                {
                    this.returnValue = value - (value * 0.10f);
                } else
                {
                    this.returnValue = value;
                }
            }
        }

很抱歉,如果我浪费了任何时间...!

问题如下: 设置“价格”属性,如果使用set / get设置的价格超过30,则价格降低10%。

我得到的是: 值为0。

我知道出了什么问题,我只是不知道如何解决。我知道它在set命令中。 显示代码后,您可能会更好地理解。

我尝试在互联网上搜索如何正确使用set命令,并尝试了执行set命令的其他方式。

public class Book
{
    public string Name;
    public string writerName;
    public string bPublisher;
    public float bPrice;
    public string bTheme;
    public float returnValue;

    public Book(string name, string writer, string publisher, float price, string theme)
    {
        Name = name;
        writerName = writer;
        bPublisher = publisher;
        bPrice = price;
        bTheme = theme;
    }

    public float Price
    {
        get
        {
            return returnValue;
        }

        set
        {
            if (this.bPrice > 30)
            {
                returnValue = this.bPrice - (this.bPrice * 0.10f);
            } else
            {
                returnValue = this.bPrice;
            }
        }
    }
}

----------这些是从程序中剪切下来的主要部分----------------------

static void Main(string[] args)
{
    Book k2 = new Book("A book", "O. Writer", "Publisher Ab", 36.90f, "Fantasy");
    Console.WriteLine(k2.Price);
}

4 个答案:

答案 0 :(得分:7)

因此,我们在这里有两个价格: net (例如45.00)和降低的价格(45.00 - 4.50 == 41.50

public Book {
  ...
  const Decimal PriceThreshold = 30.0m;
  const Decimal ReducePerCent = 10.0m; 

  private Decimal m_NetPrice;

  // Net price
  // Decimal (not Single, Double) usually is a better choice for finance
  public Decimal NetPrice {
    get {
      return m_NetPrice;
    }
    set {
      if (value < 0) 
        throw new ArgumentOutOfRangeException(nameof(value));

      m_NetPrice = value;
    }
  }  

  // Price with possible reduction
  public Decimal Price {
    get {
      return NetPrice > PriceThreshold 
        ? NetPrice - NetPrice / 100.0m * ReducePerCent
        : NetPrice;
    } 
  } 
}

请注意,我们{em> set的{​​{1}}属性没有;由于一个Price(例如Price对应两个有效的28.80NetPrice或{{ 1}}:28.80

答案 1 :(得分:6)

为什么不将逻辑放入吸气剂中。似乎更有意义,因为您没有在设置器中使用32.00 - 3.20 == 28.80

([^.]*ALPHA[^.]*)([^.]*BETA[^.]*)

编辑:

一个简短的吸气剂看起来像这样,并且(由于Patrick Hofman),您可以通过乘以0.9来计算90%:

value

我将二传手设为私人。如果要在创建public float Price { get { if (this.bPrice > 30) { return this.bPrice - (this.bPrice * 0.10f); } else { return this.bPrice; } } private set { this.bPrice = value } } 对象后也允许设置/操纵价格,请将其删除。

答案 2 :(得分:3)

您没有使用设置器来设置价格。请尝试以下。

 public Book(string name, string writer, string publisher, float price, string theme)
        {
            Name = name;
            writerName = writer;
            bPublisher = publisher;
            Price = price; // use the setter here, not the member variable 
            bTheme = theme;
        }

如果将以下内容设为私有,则将为使用错误变量的人员提供额外的保护

private string Name;
private string writerName;
private string bPublisher;
private float bPrice;
private string bTheme;
private float returnValue;

您还应该考虑将价格设为小数,以避免浮点精度错误。

根据评论,您需要在媒体资源上做更多的工作

 public float Price
        {
            get
            {
                return bPrice;
            }

            set
            {
                if (value > 30)
                {
                    bPrice = value - (value * 0.10);
                } 
                else
                {
                    bPrice = value;
                }
            }
        }

答案 3 :(得分:0)

问题是您需要在Book构造函数中设置Price,如下所示:

public Book(string name, string writer, string publisher, float price, string theme)
    {
        Name = name;
        writerName = writer;
        bPublisher = publisher;
        Price = price; 
        bTheme = theme;
    }

然后在Price的设置器中,您可以这样操作:

public float Price
    {
        get
        {
            return returnValue;
        }

        set
        {
            if (value > 30)
            {
                returnValue = value - (value * 0.10f);
            }
            else
            {
                palautus = value;
            }
        }
    }