C#编译器如何解释由var关键字指定的对象?

C#编译器如何解释由var关键字指定的对象?,c#,types,keyword,C#,Types,Keyword,C#编译器如何解释由var关键字指定的对象?我们什么时候必须使用这个关键字?如果您指的是变量声明中使用的“var”关键字,那么就没有“var type”这样的东西。此“var”被解释为(在编译时)从分配给变量的表达式推断出的类型。 从Visual C#3.0开始,在方法范围内声明的变量可以具有隐式类型var。隐式类型局部变量是强类型的,就像您自己声明了类型一样,但编译器会确定类型。有时您需要使用var,例如,在使用匿名类型时,例如在LINQ查询中: var results = context.P

C#编译器如何解释由var关键字指定的对象?我们什么时候必须使用这个关键字?

如果您指的是变量声明中使用的“var”关键字,那么就没有“var type”这样的东西。此“var”被解释为(在编译时)从分配给变量的表达式推断出的类型。


从Visual C#3.0开始,在方法范围内声明的变量可以具有隐式类型
var
。隐式类型局部变量是强类型的,就像您自己声明了类型一样,但编译器会确定类型。

有时您需要使用var,例如,在使用匿名类型时,例如在LINQ查询中:

var results = context.People.Select(p => new {p.PersonID, p.Name});
看到新的{}行了吗?这将返回一个在编译时生成的类。由于这个类没有名称,所以在代码中引用它的唯一方法是使用“var”。这减少了只为LINQ结果集创建大量特殊用途类的工作量

在幕后,无论您使用var只是作为另一种类型的简写,还是使用匿名类型,您仍然在执行静态编译时类型检查。未使用动态类型。编译器会在编译时精确地计算出类型,因此程序如下所示:

var i = 12;
i = i + "foo!";
不会编译。

在Var声明中

编译器从 赋值

为什么我们需要它们(为什么我们不能直接使用对象) 因为对象不强制类型安全

  object objtest = 1;
  objtest = "test";
  var a = 100;    
  a= "test";  
这个很好用

但是var强制执行类型安全

  object objtest = 1;
  objtest = "test";
  var a = 100;    
  a= "test";  
这不会编译,并且会产生编译时错误

我们可以在哪里使用它们
  • Linq查询返回匿名类型
  • 以及任何您想要定义类型安全变量的地方(简单性)。而不是写作 像这样的

RootClass rt=newrootclass();
List rt=新列表();
你可以这样写

var aaaaaa = new RootClass ();
var ls = new List<RootClass>();
var aaaaaa=newrootclass();
var ls=新列表();

为什么我们不使用对象类型作为匿名类型?+1来说明它的正确用法-太多人变得懒惰,到处都在使用它。@slugster-把var的使用当作懒惰,对你来说就是真正的懒惰。想必您从未花太多时间使用Haskell或F#等广泛使用类型推断的语言,也从未尝试过尽可能使用var编写C#?许多人发现在任何地方使用var都更具可读性,因此在不懒惰并评估选项后,这是一个积极的选择。+1代表Greg获得它-1对slugster的不均匀性trying@slugster-与懒惰无关<代码>var myList=新列表()
List myList=new List()更清晰易读它消除了冗余,代码更少,并且编译成相同的IL。Var不是一种类型。这只是说变量的类型与右手的类型相同side@masoud拉梅扎尼,很高兴这有帮助……)