当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#教程:匿名类型和隐式类型变量的区别

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

ASP.NET 中的 C#教程:匿名类型和隐式类型变量的区别


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-04   浏览: 259 ::
收藏到网摘: n/a

隐式类型变量 (Implicitly typed local variables)

象下面的代码书写就是隐式类型变量

var i = 5;
var str = “Csharp”
var numbers = new int[]{1,2,3};
var orders = new System.Collections.Hashtable();
var orders1 = new Dictionary();

var i = xxx ; 的作用就是用 xxx 的类型声明为i的类型。并给i 赋值。

由于声明时候,需要依赖于等号右边的表达式,所以必须同时赋值。否则下面的书写就会报错误: Error Implicitly typed locals must be initialized

var gg;

使用 Implicitly typed local variables 时应遵守下列约束:

1. The declarator must include an initializer

声明时必须包含初始化器。

2、The initializer must be an expression. The initializer cannot be an object or collection initializer by itself, but it can be a new expression that includes an object or collection initializer.

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

3、The compile-time type of the initializer expression cannot be the null type.

初始化器表达式的编译期类型不可以是空(null)类型。

比如:

var gg = null; 这行代码就会报错误: Cannot assign '' to an implicitly typed local

4、If the local variable declaration includes multiple declarators, the initializers must all have the same compile-time type.

如果局部变量声明包含了多个声明符,这些声明符必须具备同样的编译期类型。

比如如下代码:

var n = "java"
var m = 4;
var ff = m + n;

Console.WriteLine(ff);
Console.WriteLine(ff.GetType());

打印出来的信息会是:

4java
System.String

5. The initializer cannot refer to itself. (初始化中不能提起它自身)

隐式类型变量的使用范围,它可不是到处能用。仅仅可以用于下面四种情况

1. 局部变量声明

2. for 语句中变量声明)

3. using 语句初始化变量时.

4. foreach 中iterator类型声明)

比如下面代码就会报错:

class Program
{
private var tmp = "java"
}
The contextual keyword 'var' may only appear within a local variable declaration
 

隐式类型变量实际是编译器干的活(编译器局部变量的类型从初始化它们的表达式推导而来),所以

var i = 5; 这样的代码,编译后用 Reflector 再反编译看到的是:

int i = 5;

匿名类型(Anonymous Types)

匿名类型,是从对象初始化器自动推导和创建的元组(tuple)类型。

var o = new {Name = "Hello", Age = 23 };
var intArr = new[] {3,1,4,1,5} ;

就是 匿名类型的一种书写。

注意:

var intArr = new[] {3,1,4,1,5} ;  是匿名类型,当然也是 隐式类型变量

var intArr = new int[] {3,1,4,1,5} ;  是隐式类型变量

匿名类型 和 隐式类型变量 的区别

隐式类型变量 指我们可以通过等号右边的表达式,推断出等号左边该是那种类型。

匿名类型则是指,根据这个类型的初始化函数,我们可以推导出和创建出这个类型的实例。

这两个特性很多时候是一起作用的。

比如: new {Name = "Hello", Age = 23 }这个表达式的类型是匿名的,因此o就会变成那个匿名类型。

其中的 Name = "Hello" 又可以看作是 隐式类型变量。

不过应该没有人会用var i = 10;这样看起来像jscript的语法,所以var基本上就是为匿名类型而生 .

说明:

以上信息都是基于 Orcas Beta 1 的。也许正式版的时候,会发生变化。