VB當中的新語法 四

2021-08-22 17:44:28 字數 2840 閱讀 8300

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新語法稱為 區域型別推斷 簡單的說...