C#隐含类型局部变量

转载 2013年12月02日 13:06:28

参见MSDN

从Visual C# 3.0开始,在方法体内可以声明隐式的变量类型VAR,编译器可以根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型。

下面的示例演示了使用 var 声明局部变量的各种方式:

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();
需要了解的一点是, var 关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。 它只是表示由编译器确定和分配最适当的类型。

var 关键字可在以下情况中使用:

  • 在如上所示的局部变量上。
  • 在 for 初始化语句中。

for(var x = 1; x < 10; x++)
  • 在foreach初始化语句中。
foreach(var item in list){...}
using (var file = new StreamReader("C:\\myfile.txt")) {...}


var 和匿名类型

在很多情况下, var 是可选的,它只是提供了语法上的便利。 但是,在使用匿名类型初始化变量时,如果需要在以后访问对象的属性,则必须将该变量声明为 var。这在 LINQ 查询表达式中很常见。

从源代码的角度来说,匿名类型没有名称。因此,如果已使用 var 初始化查询变量,则只有一种方法可以访问返回的对象序列中的属性,那就是使用 var 作为 foreach 语句中的迭代变量的类型。

class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types, 
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */
注意:
声明隐式类型的变量有以下限制:
  •  VAR只能被用于局部变量声明时,且需要即时初始化;此变量不能被初始化为null,因为null就像lambda表达式或者方法一样没有类型。但是,可以被初始化为一个得到null值的表达式,只要这个表达式有类型。
  • var不能用作类的字段
  • var类型声明的变量不能用作自己初始化的表达式中,换言之,var v=v++;将会在编译时报错
  • 复合的隐式类型不能被同时初始化
  • 如果在作用域中,我们定义了一个var类型的变量,尝试用var关键字初始化一个局部变量,编译时会报错。
  • 使用 var 可能使其他开发人员更加难以理解您的代码。

Java中的内部类02-访问其所在方法中的final类型的局部变量

内部类对象的生命周期会超过局部变量的生命周期。         局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期...

C语言基础:C语言变量类型 - 全局变量和局部变量

前言 何为变量? 在我们之前学到的知识里面, 定义过很多变量, 比如int 变量, double变量, long变量, 这些都是属于变量, 这次我们所说的知识是在这些变量的基础上再添加一些知识, 那...

swift的全局和局部变量以及类型属性

全局变量和局部变量 计算属性和属性监视器所描述的模式也可以用于全局变量和局部变量,全局变量是在函数、方法、闭包或任何类型之外定义的变量,局部变量是在函数、方法或闭包内部定义的变量。 前面章...

Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性

全局变量和局部变量 计算属性和属性监视器所描述的模式也可以用于全局变量和局部变量,全局变量是在函数、方法、闭包或任何类型之外定义的变量,局部变量是在函数、方法或闭包内部定义的变量。   前面章节提到的...
  • zpf8861
  • zpf8861
  • 2014年07月22日 09:17
  • 3089

JDK将新增局部变量类型推断功能

OpenJDK 提出一个新的计划, 准备为 Java 增加局部变量类型推断功能(local-variable type inference capability), 这让代码编写更简单, 同时也保证原...

[转]解析C++普通局部变量与指针类型的对象变量的应用区别

首先我们先来了解一下MFC中的CPtrArray类,他可以说是CObject类型指针对象的集合。通过int Add(CObject* newElement );注意参数是一个指针类型)可以向集合中添加...

为什么局部内部类只能访问方法中final类型的局部变量?

public class OuterClass2 { static int i =1; int ii=1; public OuterClass2() { // ...

解析C++普通局部变量与指针类型的对象变量的应用区别

http://www.cnblogs.com/hellope/archive/2011/08/03/2126371.html  首先我们先来了解一下MFC中的CPtrArray类,他可以说是CObj...

通过静态局部变量看C,C++,C#,Java,PHP的特点

通过静态局部变量看C,C++,C#,Java,PHP的特点。
  • smstong
  • smstong
  • 2015年02月10日 19:58
  • 1708

c#成员变量和局部变量

在方法内部可以定义变量,被称为局部变量。局部变量的一般形式如下 [变量修饰符] 变量类型 变量名; 变量修饰符可以是final,表示这是常量。 变量类型可以是Java中任...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#隐含类型局部变量
举报原因:
原因补充:

(最多只允许输入30个字)