寫在前邊:
用了aspdotnet一段時間了,對csharp還知之甚少,今天就從csharp的基本語法開始學習。內容多為前輩同仁們blog中已寫過,加上自己得理解,只求能加深自己的印象,若能在cnblog中湊個數,那真是受寵若驚!
一.C# 3.0語言主要增強點
• 隱含類型局部變量
• 擴展方法
• 對象與集合初始化器
• 匿名類型
• Lambda表達式
• 查詢表達式( LINQ )
• 表達式樹
二.隱式類型的局部變量和數組
先來看看例句:
var i = 5;
var h = 23.56;
var s = "C Sharp";
var intArr = new[] { 1, 2, 3, 4 };
var a = new[] { 1, 10, 100, 1000 };
var str = new[] { "hello", null, "qun" };
var jcarr = new[]
{
new[] {1, 2, 3, 4},
new[] {5, 6, 7, 8}
};
var jcstr = new[]
{
new[] {"hello", "qun", "er", "wo"},
new[] {"xiang" , "ni", "le"}
};
var noname = new { name = "yaoyao", age = 24 };//匿名類型
var vlist = new List<int>();
注:"var"這個關鍵字是不是很眼熟,javascript中經常用到(互相學習現在比較常見了),當然C#中var和javascript的var差別還是比較大。
1.var只能作為局部變量使用;
就是說var只能定義在一個方法裡面,或者foreach,for,using等語句裡面:
public class VarTest
{
private void test()
{
var i = 0;
}
}
var關鍵字可以在以下四種場合中使用:
•局部變量:
var i = 5;
•在for初始化語句中:
for (var i = 0; i < 10;i++ )
•在foreach初始化語句中下邊將有例子;
•在using語句中:
using (var file = new StreamReader("C:\\myfile.txt"))
2.var可以申明任何類型變量,可以根據後面的初始化語句自動推斷類型;
這個和object有點像,但var是強類型,根據初始化表達式來定義變量的類型;
var i=0; i 是int類型
var str = "test"; str是string類型
編譯器自動推斷用var定義的變量的類型,即是,在vs2008中,將鼠標移動到var i=0; 這句上的var關鍵字上,vs2008會智能提示為struct System.Int32,而且,如下的定義賦值語句完全正確:
int value = i;
其它的情況,編譯器也類似的自動推斷變量的類型。
3.var定義時,必須使用表達式初始化;
也就是必須定義成 var i=0; 沒有初始化編譯會報錯,而且初始化值不能為null,編譯器無法根據null來推斷出局部變量的類型;初始值除了int,string等數據類型外,還可以使用new 一個對象作為初始值(從網上大家發表的看法,var使用最多的就是配合一個匿名類型的對象來使用,以及在Linq中使用)
配合匿名類型使用:
var a = new { Name = "maotin", Age = 99 };
Console.WriteLine(a.Name);
Console.WriteLine(a.Age);
在linq中應用:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var queryLowNums =
from num in numbers
where num < 5
select num;
var expr = from c in cusomers where c.City == "beijing" select c;
foreach (var s in queryLowNums)
{
Console.Write(s.ToString() + " ");
}
4.var和匿名類型:
string[] words = { "aPPLE", "biuEb", "cHeRry" };
var upperLowerWords =
from w in words
select new { Upper = w.ToUpper(), Lower = w.ToLower() };
foreach (var word in upperLowerWords)
{
Console.WriteLine("Uppercase:{0},Lowercase:{1}", word.Upper, word.Lower);
}
注:
很多時候var是可以省略的;
但是在使用匿名類型初始化變量時,必須使用它;
由於只有編譯器知道匿名類型的名稱,因此必須在源代碼中使用它;
如果已經使用了var初始化了查詢變量,則還必須使用var作為對查詢變量進行循環訪問的foreach語句中迭代變量的類型。
5.var使用建議
一般var不要像“var i=9;”這樣使用,程序可讀性不高;在匿名類型中使用比較方便;foreach中使用也不錯;var只是語言層面的東西,編譯器會在編譯的時候通過類型推斷把它換成真正的類型。