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 ++
:
number
is incremented by 1 number
returns to the caller When you use postfix ++
:
number
returns to the caller 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.