简体   繁体   中英

C# get property returns wrong integer

Here's the program.

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;
    }
}

after executing the program with this code below,

public class Stock {
    int number;

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

Screen displays 29. I'm expecting it to be 28.

and with this code below,

public class Stock {
    int number;

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

Gives 261 instead of 81.

Why?

It's called one more time than you are expecting because this line:

 obj.Number -= 3;

is equivalent to obj.Number = obj.Number - 3;

Which is basically calling your getter and setter.

Before subtracting 3 , Number is incremented by 1 because of prefix ++ .

UPDATE

When you use prefix ++ :

  1. number is incremented by 1
  2. number returns to the caller

When you use postfix ++ :

  1. number returns to the caller
  2. number is incremented by 1

Let's add backing field number and make it public for illustration purposes only:

public class Stock
{
    public int number; //public - only for illustration

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

With prefix ( 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

With postfix ( 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

As you see, with postfix the Number property returns non-incremented number backing field, while with prefix - number is updated before returning to the caller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM