C#get属性返回错误的整数

时间:2017-12-27 09:24:21

标签: c#

这是该计划。

using System;

public class Program {

    public static int Main(string[] args) {

        Stock obj = new Stock();
        obj.Number = 30;
        obj.Number -= 3;
        Console.WriteLine(obj.Number);
        return 0;
    }
}

使用以下代码执行程序后

public class Stock {
    int number;

    public int Number {
        get { return ++number; }
        set { number = value; }
    }
}

屏幕显示29.我希望它是28。

并使用以下代码

public class Stock {
    int number;

    public int Number {
        get { return number * 3; }
        set { number = value; }
    }
}

给出261而不是81。

为什么?

2 个答案:

答案 0 :(得分:10)

它比你预期的要多一次,因为这一行:

 obj.Number -= 3;

相当于obj.Number = obj.Number - 3;

这基本上是召唤你的吸气者和设定者。

答案 1 :(得分:2)

在减去3之前,由于前缀Number++会增加1。

<强>更新

使用前缀++时:

  1. number增加1
  2. number返回来电者
  3. 使用postfix ++时:

    1. number返回来电者
    2. number增加1
    3. 让我们添加支持字段编号并将其公开仅用于说明目的:

      public class Stock
      {
          public int number; //public - only for illustration
      
          public int Number
          {
              get { return number; }
              set { number = value; }
          }
      }
      

      使用前缀return ++number):

      var stock = new Stock();
      stock.number = 10; //Set backing field directly 
      Console.WriteLine($"Number backing field now is: {stock.number}"); // 10
      Console.WriteLine($"Get Number with prefix: {stock.Number}");      // 11
      Console.WriteLine($"Number backing field now is: {stock.number}"); // 11
      

      使用后缀return number++):

      var stock = new Stock();
      stock.number = 10; //Set backing field directly 
      Console.WriteLine($"Number backing field now is: {stock.number}"); // 10
      Console.WriteLine($"Get Number with postfix: {stock.Number}");     // 10
      Console.WriteLine($"Number backing field now is: {stock.number}"); // 11
      

      如您所见,使用postfix,Number属性返回非递增的number后备字段,而前缀 - number在返回调用者之前更新。