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类型的局部变量

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

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

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

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

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

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

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

c#成员变量和局部变量

在方法内部可以定义变量,被称为局部变量。局部变量的一般形式如下 [变量修饰符] 变量类型 变量名; 变量修饰符可以是final,表示这是常量。 变量类型可以是Java中任...

C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量

摘要:2012年09月30日歪曲事实中秋佳节快乐除了撞单,我又交待道,不要轻易过去面谈,功能上差不多,那个单是早就谈好了的,不知道他的目的是什么,招聘中人员的中秋佳节快乐分配也是经理们比较在意的,怎么...

【C#】全局变量、全局静态变量、局部变量、局部静态变量的区别

最近在学习设计模式中的单例模式时,里面用到了一个全局变量,虽然早在学习VB的时候就明白什么是全局变量,但从来没有区分过。比如有全局静态变量、局部变量、局部静态变量等,那么他们之间又有什么区别呢!强烈的...

C++C#数据类型对照表

  • 2017-08-17 23:31
  • 19KB
  • 下载

C#常用类型总集

【C#】 8. Date类型

自定义日期类型,标准化格式,工作日
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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