程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> C#教程:匿名類型和隱式類型變量的區別

C#教程:匿名類型和隱式類型變量的區別

編輯:關於.NET

隱式類型變量 (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 的。也許正式版的時候,會發生變化。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved