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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-04   浏览: 165 ::
收藏到网摘: 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 的。也许正式版的时候,会发生变化。