簡體   English   中英

C#get屬性返回錯誤的整數

[英]C# get property returns wrong integer

這是程序。

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。

為什么?

它比你預期的要多一次,因為這一行:

 obj.Number -= 3;

相當於obj.Number = obj.Number - 3;

這基本上是你的getter和setter。

在減去3之前,由於前綴++Number增加1。

UPDATE

使用前綴++

  1. number加1
  2. number返回給調用者

當您使用postfix ++

  1. number返回給調用者
  2. number加1

讓我們添加支持字段編號並將其公開,僅用於說明目的:

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

使用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

如您所見,使用postfix, Number屬性返回非遞增number后備字段,而帶前綴 - number會在返回給調用者之前更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM