使用var时,c# For循环类型推断

本文关键字:循环类 类型 循环 For var 使用 | 更新日期: 2023-09-27 18:13:42

考虑以下代码…

            double total = Int32.MaxValue;
            total++;
            int previousX = 0;
            for (var x = 0; x <= total; x++)
            {
                if (x == Int32.MaxValue)
                {
                    Console.WriteLine("Int32 max reached.");
                }
                if (x < 0)
                {
                    Console.WriteLine("Counter now < 0.");
                }
                previousX = x;
            }

如果在for循环中使用var,则默认类型推断是int类型。

这是正确的吗?因为如果计数器超过int 32的最大值,它不会溢出堆栈,而是将自身重置为0,然后从0开始倒数。

注意:previousX允许你设置断点,并查看计数器"x"的前一个值。

有人知道为什么会这样吗?

使用var作为for循环的计数器可能会遇到一些麻烦。

使用var时,c# For循环类型推断

x的类型由初始值决定,该初始值为整型文字0

如果您希望x为双精度,则使用双精度文字0D

重要的是要理解var关键字并不意味着"变体",也不表示变量是松散类型的,或延迟绑定的。它只是意味着编译器确定并分配最合适的类型。因为你有var x=0,它确定x是一个int,以匹配0。所以,是的,这是正确的功能。

由于负数的表示方式(2恭维)是一个数字包装其最大值,它将被重置并从-1开始计数。

x++的增量直到循环的迭代完成后才会发生。

当然,如果你增加一个int超过MaxValue,它会回到MinValue,并从那里开始增加

这确实很有趣,但与var的使用无关。当使用int(或者实际上是long, short等)时,仍然会发生这种情况。

这里真正的罪魁祸首是循环的最大值大于int32的最大值。当一个数值递增时,该数值将自动换行,导致无限循环。你可以声明var x, int x, short x,所有这些都会以类似的方式循环。

递增的数值会导致"绕行"。您可以通过运行以下代码并观察增量前后的值来尝试它。(如果添加减量也可以)。

        int a = Int32.MaxValue;
        Console.WriteLine(a);
        a++;
        Console.WriteLine(a);
        short b = Int16.MaxValue;
        Console.WriteLine(b);
        b++;
        Console.WriteLine(b);
        long c = Int64.MaxValue;
        Console.WriteLine(c);
        c++;
        Console.WriteLine(c);
顺便说一句,上面代码片段中的var通过语句var x = 0被设置为int型。'0'本身是一个int,因此x的类型被设置为int。如果您声明var x = 0F或0L,则类型将不同。

Var确切类型由您使用的=操作符定义。在c#中,0int类型,因此编译器使用int

这里没有什么特别的。var将被推断为Int32,因为这是0的默认值。如果你想要一个长,使用var x = 0L。或者只是long x = 0

var x = 0将推断出x是一个整数,因为您使用的是整数字面量("0")。

查看这篇关于整数溢出的相关文章:

为什么这会导致长整数溢出

这看起来很简单:

var x = new User()

当编译器看到这一行时,他将var替换为User,因为这是构造函数返回的值。函数调用也是如此:

var x = y.ToString()

ToString()返回string,所以编译器知道用什么代替var

var x = 0

实际上是调用int构造函数,所以var被替换为int

你有三个选择:

  • double x = 0 ...
  • var x = 0.0 ...
  • var x = 0D ...

注意:D后缀为double