类型推断使用var
关键字。编译器通过变量初始化的内容“推断”变量的类型
例如var somenum = o;
变成int somenum = 0;
即使 somenum 永远不会被声明为int
,编译器也会想到这一点。只要它在范围内,somenum就是int
。
就像variant
中使用的visual basic
类型一样。在程序中使用它,在某种程度上会降低性能和性能。在3.5之前的网络框架中不包含var
。
即使它降低性能也会降低dot net framework支持强类型检查,为什么var
包含在框架3.5中?
是var
紫罗兰强类型检查?如果不是如何?
答案 0 :(得分:6)
var
根本不会降低性能。该变量仍为strongly typed:
隐式类型的局部变量是强类型的,就像你一样 我自己声明了类型,但编译器确定了类型。
唯一的区别是您不必手动拼出源代码中的类型。 VB 6的Variant
根本没有任何关系,如果这就是你所指的。
答案 1 :(得分:4)
它根本不像Variant
,并且不会降低性能。
在.NET中,var由编译器提供为速记机制;编译后的代码就像你声明了正确的类型一样强类型。
答案 2 :(得分:1)
什么?不,哇,你错了。
C#的var
没有就像VB的Variant
一样,C#中的dynamic
(或多或少)。
var
只是编译器在编译程序时填写的占位符,在运行时实际类型已完全声明和使用,因此绝对没有性能损失。
// this won't work
var i=0;
i="a"; // it would with dynamic though!
答案 3 :(得分:1)
此外,没有性能命中,因为它被编译到IL,它以相同的方式结束。
答案 4 :(得分:1)
var
不会降低性能,但仍然是强类型的。
之所以引入它是因为它对LINQ是必要的,因为LINQ能够返回“anonymous types”。 这是引入此关键字的主要原因,因为您无法控制将由编译器生成的类型的名称。 一个附加值是,你可以使用它作为语法糖,在声明一个变量时不复制变量的类型:
var = new List<MyComplexType<WithTypeParameter>>();
而不是:
List<MyComplexType<WithTypeParameter>> x = new List<MyComplexType<WithTypeParameter>>();
例如。
无论如何,var不像Visual Basic中的Variant数据类型。将某个实例分配给已使用var关键字声明(并初始化)的变量时,不能为其分配其他类型的实例。 除此之外,您无法在不初始化的情况下声明'var'变量。