简体   繁体   English

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

[英]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 ++ : 使用前缀++

  1. number is incremented by 1 number加1
  2. number returns to the caller number返回给调用者

When you use postfix ++ : 当您使用postfix ++

  1. number returns to the caller number返回给调用者
  2. 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++ ): 使用postfixreturn 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.

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