使用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循环的计数器可能会遇到一些麻烦。
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#
中,0
是int
类型,因此编译器使用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