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 可能使其他开发人员更加难以理解您的代码。

隐含类型局部变量

var i = 5;var h=23.56;var s = “C Sharp";var intArr = new[] {1,2,3,4} ;//数组中的项类型不能不同var a = new[] { 1...
  • phqm
  • phqm
  • 2008年02月09日 20:18
  • 307

C# 3.0 新特性之隐含类型局部变量

C# 3.0 新特性之隐含类型局部变量2009年8月18日 云飞扬 发表评论 阅读评论 -C# 3.0 新特性隐含类型局部变量(Local Variable Type Inference)一般情况下我...
  • rise51
  • rise51
  • 2011年01月19日 18:03
  • 261

函数中未指定存储类别的局部变量,其隐含的存储类别为(自动存储类别)

函数中的局部变量,如果不专门声明为static存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。这类变量叫做自动变量,自动变量可以用关键字auto作为存储类别的声明,实际上关键字auto是可...
  • xvlhy
  • xvlhy
  • 2015年09月22日 17:01
  • 1274

C#中利用var对局部变量的隐式类型声明

        C#提供了var关键字,只能声明局部变量,而且必须对变量赋非null的初始值,由编译器根据初始值推测具体的数据类型。        这种方法类似JavaScript这样的弱类型编程语言...
  • aspnet2002web
  • aspnet2002web
  • 2010年09月10日 00:50
  • 2999

1------隐含类型局部变量Var

隐式类型局部变量VAR是3.0中的特性。就是能够自动识别您定义的类型是整型,字符串等等。识别的前提是必须要赋值的。而且不能赋值为NULL的。只能局部使用即局部变量而已。如:--------------...
  • zhvsby
  • zhvsby
  • 2011年01月12日 11:54
  • 448

C#3.0之隐含类型局部变量

我们知道语言大概可以分为两大类:强类型语言,譬如C#,JAVA,C等和弱类型语言,譬如javascript强类型语言每个变量必须有明确的类型,如int,double等,而弱类型语言则没有这样的要求,譬...
  • kittyjie
  • kittyjie
  • 2007年07月23日 16:10
  • 671

隐含强制类型转换——从变量说起

隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:          byte b =3;          我们知道一个整数的默认类型int类型,没错3是int类型...
  • pt666
  • pt666
  • 2017年04月22日 18:30
  • 491

C# 字段和局部变量

开始重新整理一些不常用被忽略的基础
  • andyzhang0216
  • andyzhang0216
  • 2017年02月21日 23:00
  • 459

隐含类型局部变量(Local Variable Type Inference)

隐含类型局部变量(Local Variable Type Inference)C#3.0引进了var这个新关键字,在声明局部变量时可用于替代原先的类型名,即当一个变量声明标识为var类型并且该范围域中...
  • TengDong2008
  • TengDong2008
  • 2010年01月28日 09:56
  • 321

C#3.5语言新特性(二)-隐含类型局部变量

  可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework ...
  • TheMoment_Rain
  • TheMoment_Rain
  • 2008年06月19日 14:24
  • 542
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#隐含类型局部变量
举报原因:
原因补充:

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