Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#get属性返回错误的整数_C# - Fatal编程技术网

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

C#get属性返回错误的整数,c#,C#,这是节目单 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; } } 使用下面的代码执行程序

这是节目单

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; }
    }
}
public class Stock {
    int number;

    public int Number {
        get { return number * 3; }
        set { number = value; }
    }
}
屏幕显示29。我预计是28岁

使用下面的代码

public class Stock {
    int number;

    public int Number {
        get { return ++number; }
        set { number = value; }
    }
}
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

更新

使用前缀
++
时:

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
  • 数字
    增加1
  • 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
    
  • number
    返回给调用方
  • 数字
    增加1
  • 让我们添加支持字段编号,并将其公开,仅用于演示目的:

    public class Stock
    {
        public int number; //public - only for illustration
    
        public int Number
        {
            get { return number; }
            set { number = value; }
        }
    }
    
    带有前缀的
    返回++编号
    ):

    带后缀的
    返回号码+++
    ):


    如您所见,对于后缀,
    Number
    属性返回非递增的
    Number
    支持字段,而对于前缀-
    Number
    则在返回调用方之前更新。

    public static int Main(string[/args)
    ?真正地谁得到这个
    int
    值?学习调试。在程序的开头放一个断点,然后逐行执行。或者,如果您想更精确,请在getter中设置一个断点,并查看它何时被命中。你会立即得到它为什么要做它正在做的事情的答案。@ZoharPeled它被设置为环境变量。注意,带有副作用的属性getter(比如你的例子中的
    ++number
    )从来都不是一个好主意。啊,在重读时,也许你有,只是不是很清楚。我认为你的答案应该是清楚的,增量在程序中运行了两次。我仍然坚持我的意见,即你的答案没有添加任何现有答案中没有的内容(虽然我经常欣赏你在写你的答案时出现其他答案,但我相信这个答案不会花五分钟写出来。-)我可能会亲自删除它。或者,如果你改进了你的答案,我可能会投赞成票(我相信奖励人们投入的时间)。