[英]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. 屏幕显示29.我期待它是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. 给出261而不是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;
相当于
obj.Number = obj.Number - 3;
Which is basically calling your getter and setter. 这基本上是你的getter和setter。
Before subtracting 3
, Number
is incremented by 1 because of prefix ++
. 在减去
3
之前,由于前缀++
, Number
增加1。
UPDATE UPDATE
When you use prefix ++
: 使用前缀
++
:
number
is incremented by 1 number
加1 number
returns to the caller number
返回给调用者 When you use postfix ++
: 当您使用postfix
++
:
number
returns to the caller number
返回给调用者 number
is incremented by 1 number
加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
): 使用前缀 (
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++
): 使用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. 如您所见,使用postfix,
Number
属性返回非递增number
后备字段,而带前缀 - number
会在返回给调用者之前更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.