C# 3.0新特性系列:隐含类型var

一.神奇的var

在C#3.0中增加了一个变量声明var,这个声明和JavaScript 的 var类似,但 也有不同。

1. 相同点,它可以用var来声明任何类型的局部变量。

2. 不同点,它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变 量的类型,而且只能是局部变量。

二.相同点

它可以声明

var integer = 10;
var name = "edisundong";
var numbers = new int[] { 1, 2, 3 };

三.不同点

var仅仅是一个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编 译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于

int integer = 10;
string name = " edisundong ";
int[] numbers = new int[] { 1, 2, 3 };

三.注意点

1.在声明时必须同时赋值,因为声明依赖于赋值号右边的表达式,如果有下 面的语句:

var integer;
integer = 10;

编译时会报Implicitly typed locals must be initialized错误。

2.在使用var声明一个局部变量后,它仍然具有强类型,可以做如下测试:

var integer = 10;
integer = " edisundong ";

编译时会报Cannot implicitly convert type 'string' to 'int'错误。

3. 初始化器表达式的编译期类型不可以是空(null)类型,编译器无法根据 null来推断出局部变量的类型,如有下面的语句:

var integer = null;

编译时会报Cannot assign '<null>' to an implicitly typed local 错误。

4. 初始化语句必须是一个表达式,初始化表达式不能包含它自身,但是可以 是包含一个对象或集合初始化器的一个new表达式(即匿名类型)。

如可以这样去声明:

var coll = new Hashtable();

5. var的声明仅限于局部变量,也可以包含在foreach、for、using语句中。 下面的使用是错误的:

class Program
{
 private var i = 10; //全局私有变量。
 static void Main(string[] args)
 { }
}

编译时会报The contextual keyword 'var' may only appear within a local variable declaration错误。

时间: 2024-09-08 07:23:26

C# 3.0新特性系列:隐含类型var的相关文章

JDK5.0新特性系列---目录

  JDK5.0新特性系列---目录   JDK5.0新特性系列---1.自动装箱和拆箱   JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列---4.静态导入 JDK5.0新特性系列---5.可变长参数Varargs JDK5.0新特性系列---6.格式化输出 JDK5.0新特性系列---7.使用ProcessBuilder执行本地命令 JDK5.0新特性系列---8.泛型编程 JDK5.0新特性系列---9.注释功能Annota

JDK5.0新特性系列---11.6线程 BlockingQueue

  importjava.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;   /**     本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会

JDK5.0新特性系列---11.1线程 Callable和Future

  import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;   /**     从本节开始,主要介绍J2SE5.0与线程相关的新特性,新的线程类主要集中在java.util.concurrent 包中,本节实例将介绍如何使用java.uti

JDK5.0新特性系列---11.3线程 锁Lock

  import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.Reent

JDK5.0新特性系列---11.2线程 任务执行架构

  import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecu

JDK5.0新特性系列---5.可变长参数Varargs

      /**  * 在J2SE5.0之前,当传入到方法的参数个数不固定时,经常采用数组的方式传递参数  * 在J2SE5.0之后,可以使用可变长参数的我给方法传递参数  */ /**  * 在参数类型和参数名之间使用"..."(三个英文的点),表示该参数为可变长的  * 通过新的for循环读取可变长参数中的值  * 一个方法里最多只能有一个变长参数,而且这个变长参数一定要放在参数表的最后一个参数 */ import static java.lang.System.*; publi

JDK5.0新特性系列---10.监控与管理虚拟机

  import java.lang.management.ClassLoadingMXBean; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.

JDK5.0新特性系列---8.泛型编程

  import java.util.ArrayList; import java.util.Collection; import java.util.List;   /**  *泛型编程关键掌握两点:  *1.在方法参数中使用通配符  *2.在方法的参数类型和返回类型中使用通用类型  */ /**关键技术  *1.通配符问号(?)表示任意类型.如"List<?>"表示可以存放任意对象类型的List  *2.通配符可以接extends和super,表示有限制的通配符.如&q

JDK5.0新特性系列---1.自动装箱和拆箱

/**  * 基本类型的数据值可以直接赋给基本数据对象,基本数据的对象也可以直接赋给基本数据变量  * 在表达式中,基本类型的数据值可以和基本数据对象进行运算  * 基本数据类型的数组不能实现自动装箱和拆箱,即int[]不能当成Integer[]使用  */ /**  * 演示基本数据类型的自动拆箱和装箱  */ public class AutoBox {        /**整数类型的自动拆箱和装箱*/        public static void intAutoBox(){