vb當中的新語法
(四
)
--lambda
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
這個世界上很多東西是沒有道理的...不知道你是不是也會這樣覺得。
老實說,過去寫程式寫慣了的人,一開始看到lambda表示式會覺得怪怪的,我先講它的意義,官方說法是,lambda表示式可以簡化程式**的寫法、增加可讀性(老實說我覺得簡化程式**的寫法這件事情很少跟增加可讀性可以一起發生,通常程式**越簡化,可讀性就越差...),對lambda表示式來說,簡化程式**寫法可能是做到了,增加可讀性我就很猶豫了,不過如果真要說起來,lambda表示式的出現(或是為什麼在這個版本出現)其實說穿了還是跟linq有關...
先寫乙個簡單的lambda:
function(para1 as integer) para1 + 1
msdn上說,lambda表示式是沒有名稱的函式,所以上面名稱不見了,return也不見了,其實你可以想成:
function
函式名稱(para1 as integer)
return
para1 + 1
上面這樣的簡寫,只是把函式名稱和teturn拿掉,這樣就比較容易懂了。
例如,原本應該寫成
'計算身高體重的bmi值
function
bmi(height as single,weight as single)
return
weight / ((height / 100) ^ 2)
end function
就變成(拉成一行)
function(height as single, weight as single) weight / ((height / 100) ^ 2)
對照著寫就比較容易理解了,函式名稱不見了, 自然end function也不見了,return也不見了,差不多這樣,就是lambda表示式了。
注意:另外乙個很重要的是,函式寫在程式**區塊外面,lambda表示式則混雜在一般的程式**裡面。(往下看,就會知道意思)
好,定義出來的lambda表示式怎麼用呢?
最簡單的方式是在lambda表示式的外面加上( )
, 變成(
lambda表示式)然後再把引數給進去,所以就變成:
(lambda表示式)(lambda表示式需要的引數值)
例如:dim ret as single
ret = (function(height as single, weight as single) weight / ((height / 100) ^ 2))(170, 60)
意義是→接收值=(lambda
表示式)(lambda表示式需要的引數值)
差不多就是這樣,但是,這樣很難用對不對....對!!!
所以,大多數人就寫成這樣:
dim bmi = (function(height as single, weight as single) weight / ((height / 100) ^ 2))
dim ret as single
ret = bmi(170, 60)
其中的bmi我們稱為委派變數,bmi是乙個變數,但是在記憶體中是乙個函式的位置,所以我們可以呼叫他(傳入170, 60)計算出乙個bmi值,再用ret這個single變數去接收,完成,就是這樣。
不過問題開始浮現,如果要這樣搞,那為何不乾脆一開始就直接建立乙個bmi函式就算了?幹嘛用lambda建立了乙個沒有名稱的函式,又要用另乙個變數去委派呢???
這還是有原因的,原因也還是跟linq有關,我們看一段點底下的程式**:
function test()
dim a() as integer =
dim b = from item in a where item > 3
return false
end function
其中的變數b的**值是一段linq語法,這段語法會被compile成:
public shared function test() as object
dim a as integer() = new integer()
dim b as ienumerable(of integer) = enumerable.where(of integer)(a, new func(of integer, boolean)(nothing, directcast(module1._lambda$__1, intptr)))
return false
end function
你會注意到,其中就有呼叫到一段compile幫你自動產生的lambda表示式。你會發現,lambda有大半在這個版本的.net中會出現的原因跟linq有著密不可分的關係。所以你會慢慢了解,為何從很多檔案和名家的blog當中都這麼說,從.net 2.0之後,其實本質上.net framework已經沒有太大的改變,而其他的部分.net 3.0中的wpf, wwf...等,是額外加上去的,迭在原本的架構之上,同樣的.net 3.5當中所提供的linq機制,也就是namespace位於system.linq底下的,則是在.net 3.5當中迭在3.0之上的一塊,骨子裡都一樣,所以為了實現linq這樣而外加上去的特殊語法,所以增加了lambda,讓你開發的時候可以很輕鬆的編寫from item in a where item > 3 這樣的語法,再由ide與compile通力合作,把要完成的功能隱藏在這段所謂的linq語法後面,再通過lambda和其他的技巧實現,完成現在你看到的偉大工作。
VB當中的新語法 二
vb當中的新語法 二 區域型別推斷 與 xml 當你看完筆者這幾篇關於vb 的新語法介紹之後,你會發現其實都跟 linq 有很密切的關係,儘管有些功能看似語法上的新擴充,但是實務上會使用到這些語法的場合,大多跟 linq 多少脫不了關係呢 接著我們要來看的第二個 vb新語法稱為 區域型別推斷 簡單的...
VB當中的新語法 一
vb當中的新語法 一 匿名型別 上週跟大家介紹了linq在vb當中的應用之後,這次順帶介紹一下vb在這個版本中的改變,在vb 2008當中,配合linq新增了許多新的語法,底下這也是vb在建立物件時的新寫法 dim stud1 as new students with 上述指令會建立乙個studen...
VB當中的新語法 二
vb當中的新語法 二 區域型別推斷 與 xml 當你看完筆者這幾篇關於 vb的新語法介紹之後,你會發現其實都跟 linq 有很密切的關係,儘管有些功能看似語法上的新擴充,但是實務上會使用到這些語法的場合,大多跟 linq 多少脫不了關係呢 接著我們要來看的第二個vb新語法稱為 區域型別推斷 簡單的說...