2008年6月24日 星期二

VB當中的新語法(二) - 區域型別推斷 與 XML

當你看完筆者這幾篇關於VB的新語法介紹之後,你會發現其實都跟LINQ有很密切的關係,儘管有些功能看似語法上的新擴充,但是實務上會使用到這些語法的場合,大多跟LINQ多少脫不了干係呢~

接著我們要來看的第二個VB新語法稱為『區域型別推斷』,簡單的說,就是當你宣告變數時不指定型別的時後編譯器會自動幫你決定變數的型別,而不是一律的以object作為變數的型別,運算時再透過boxing來解決。

過去,當你鍵入底下的程式碼:

Dim v

這個變數v是Object型別,在舊版的VB 6.0當中,則是variant,如今,當你在編輯器當中輸入這樣的程式碼:

Dim v = 3

你的變數v型別會自動設為integer,倘若是:

dim v = 3.14

你的變數v型別會自動設為double。
總括來說,編譯器會依照初始值來決定變數型別。

甚至,變數的型別也可以由函式的回傳值來決定,例如:
Dim ret = getBMI()

嚴格說起來,這些動作都是編輯器自動幫你做的, 對程式碼來說沒有什麼太大的影響,有一些部分也是因為在過去VB本來就會進行相當多的隱含型別轉換,所以這些動作對開發人員來說沒啥特別的感覺,但是實務上它可以加快程式運行的速度(因為不需要再做這些型別轉換)

然而,你可能看到更多的使用場合是把這個機制和LINQ的查詢回傳值混在一起,再回頭看前幾天介紹的LINQ語法:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

從這邊你會看到透過查詢語法所回傳的值,也是透過這樣的機制來建立的。總的來說VB在語法上的更新,蠻多都實現在LINQ相關的應用上,這也是先前說過VB新語法與LINQ幾乎脫不了干係。

另外,由於有型別推斷,你可以在VB當中直接這麼寫:

你可以直接把XML以Copy Paste的方式貼到程式碼編輯區,然後定義一個變數來承接,由於具有型別推斷的功能,因此xmlData變數會被定義成xElement型別,寫起程式來方便多了。

2008年6月23日 星期一

VB當中的新語法(一) - 匿名型別

上周跟大家介紹了LINQ在VB當中的應用之後,這次順帶介紹一下VB在這個版本中的改變,在VB 2008當中,配合LINQ新增了許多新的語法,底下這也是VB在建立物件時的新寫法:

  Dim stud1 As New students With {.name = "David", .score = 100}

上述指令會建立一個students 物件的實體,並且填入預設的值。
這樣的寫法簡便不少,該物件的類別宣告如下:

Public Class students
  '這邊應該寫成property, 只是我稍微偷懶一下寫成field,不影響demo
  Public name As String
  Public score As Single
End Class

上面黃色程式碼這樣的方式我們稱之為具名型別的物件宣告,既然,有具名型別,就一定會有匿名型別的宣告方式,語法如下:

Dim stud2 = New With {.name = "David", .score = 100}

這個就炫了吧,不用型別照樣可以宣告出一個物件實體,這個在VB 2008稱為匿名型別,其實和LINQ有相當大的關係,幹嘛搞出一個匿名型別呢? 它可以方便我們不需要事先建立一個類別,就可以具有物件實體,會有這樣的需求?

某些時候,我們只想要產生一個物件,並且隨手就拿來用了,我們可能懶的宣告一個物件的類別,然後再用New指令產生一個物件實體,也有時候我們只是希望建立一個臨時的物件來存放特定資料處理(查詢)之後的結果,最典型的例子就是LINQ(容後再述),因此匿名型別就應運而生了。

匿名型別並不特別也不神奇,實現的方式很簡單,Compiler 會自動依照你的需要,幫您建立一個類別Class,幫你自動決定類別中屬性的型態。這個自動建立的類別沒有名稱(因為是編譯階段自動建立的,所以沒名稱也不打緊,反正我們在程式碼當中也不會用到這個類別,只會用到這個類別產生的物件實體)、這個類別會直接繼承自 Object,並且包含您在宣告物件時指定的屬性。

這個特性是一個基礎,它讓LINQ查詢的結果可以自動建立成一個物件,例如我們在 2008年6月18日 星期三 介紹的LINQ功能中,有一段程式碼:

Structure BMI  
  Dim name As String  
  Dim height As Integer  
  Dim weight As Integer  
  Dim BmiValue As Single
End Structure

Dim matrix(5) As BMI

(...略...)

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

其中matrix是一個物件沒有錯,但是result是什麼型別? 怎麼出現的? LINQ查詢會建立出一個物件? 怎麼建立的呢? 關鍵就在匿名型別。

有了匿名型別這樣的技術作為基礎,LINQ的查詢結果(物件)就可以不需要事先建立一個特定類別作為存放查詢結果的資料型別。而可以透過編輯器自動產生這個類別,我們只需要直接把結果(物件)拿來用,因為我們在意的是這個查詢結果物件而非該類別本身。

不過這邊要注意,並非所有的LINQ查詢結果一定就需要建立一個匿名型別來存放,也有可能只需要系統內建的型別即可。

例如:
Dim result = From c In matrix Where c.BmiValue > 25 Select c.name

result 就只需要String型別即可。

anyway, 匿名型別確實讓開發人員在撰寫程式碼的時候有更多的可能性,也方便許多,同時間,你也會發現,編譯器暗地裡幫我們做了很多的事情...說到這個,下次有機會時來談談編譯器是怎麼看待LINQ指令的,你會發現VB2008的編譯器比過去忙碌了許多。

2008年6月21日 星期六

Sharepoint 開發工具:Visual Studio Extensions for SharePoint Released

我不知道目前台灣有多少開發人員(或是MIS team)有使用MOSS,如果你是developer,也有使用MOSS的習慣,那你可能會對底下這個消息有興趣:

Visual Studio Extensions for SharePoint Released (英文版, 簡中轉繁中之後的內文如下)

SharePoint正迅速成為企業利用微軟.NET技術構建內部網站(EIP)的CMS(content management system)平臺。SharePoint雖然內建很多功能,但還是需要使用ASP.NET進行大量的客製。為了加快這種客製工作,微軟最近為SharePoint開發人員發佈了幾個有用的資源。

為了讓SharePoint專案易於開發,微軟創建了Visual Studio Extensions for SharePoint。VS 2005版本的已經於二月發佈,而VS 2008版本就在前幾天也發佈了。針對VS 2005版本(1.1版)的 User Guide, Samples, and Walkthroughs 現在已可下載。而VS 2008版本(1.2版)有望在這個月末發佈。

微軟還建立了一個新的SharePoint網站,專注于提高開發人員學習相關技術的速度。這個網站目前還在建設之中,雖然已經列出了大量有趣的主題,但還沒有足夠多的內容。當這個網站的建設完成後,讀者就可以看到每個主題都會包含一個虛擬實驗室、網路廣播、快速入門嚮導、白皮書和可供下載的動手試驗等。(David註:應該是我先前看過的一個線上Lab,有點像認證考試的那種)

2008年6月20日 星期五

有人問起C#的LINQ寫法...

有人問起C#的LINQ寫法...也很簡單...
關鍵的地方稍微修改一下,差不多是底下這樣...

  //查詢BMI值大於25的人
  var result = from c in matrix where c.BmiValue > 25 select c;
  //顯示名稱
  foreach (string item in (from c in result select c.name)) {
    MessageBox.Show (item);
  }

簡單吧,說真的,截至目前為止,我始終覺得LINQ是一個方便好用的東西,如果你的程式碼沒有太多向後相容的考量,且開發團隊也打算用.NET繼續開發下去,截至目前為止我找不到理由不在程式碼當中使用LINQ,這也是我對於讀者詢問的想法和回答。

2008年6月18日 星期三

LINQ其實很簡單

會寫這一篇是有原因的,不只一次有人問我,要不要學LINQ呢?
LINQ看起來很難耶...為何要放棄以前的SQL來學LINQ呢?到底LINQ的意義是什麼?

反正就是有一缸子的問題,說真的,由於最近也沒時間寫本LINQ的書,但是工作累了順手寫寫BLOG還可以,所已針對LINQ這個主題,和大家有一些分享。

其實對於VB開發人員來說,掌握LINQ說真的比C#來的簡單很多,主要的原因就是VB當中有非常多"自動"的隱含型別轉換,是不需要寫程式碼的,也因此操作起來比起C#真的容易不少。

要掌握LINQ的精神,得要知道LINQ出現的目的,其實很簡單,只有一句話,就是希望 "能夠達成以單一的一種語法來查詢多種不同的對象" 的目的。這其來有自,過去我們要查詢資料庫要用SQL、要查詢XML要用XMLDOM物件、要查詢AD又要用另一種不同的查詢方式,總之,查詢這個動作一天到晚出現在電腦程式碼當中,但是開發人員卻要學習多種不同的方式,很困擾,所以LINQ就出現了。

所謂的LINQ,是 .NET Language Integrated Query,也就是在.NET的開發語言當中,直接把查詢的技術給 "整" 進去,目的就是要加快搜尋(速度)與降低開發成本。

所以從.NET 3.5開始, LINQ變成.NET標準語法的一部分,OK,就是這樣,所以我們來看看 LINQ怎麼查詢,首先,為了展示LINQ,我定義了底下這樣的結構:

Structure BMI
  Dim name As String
  Dim height As Integer
  Dim weight As Integer
  Dim BmiValue As Single
End Structure

你用類別也可以,總之上面的結構用來表達一個人的身高,體重,名稱和BMI值。

接著,我撰寫底下程式碼:

'定義陣列
Dim matrix(5) As BMI
'填入測試資料
matrix(0).name = "王小寶"
matrix(0).height = 170
matrix(0).weight = 65
matrix(1).name = "韋大寶"
matrix(1).height = 176
matrix(1).weight = 95
matrix(2).name = "章新寶"
matrix(2).height = 150
matrix(2).weight = 55
matrix(3).name = "沈中寶"
matrix(3).height = 192
matrix(3).weight = 75
matrix(4).name = "蕭敦寶"
matrix(4).height = 150
matrix(4).weight = 65
matrix(5).name = "林寶寶"
matrix(5).height = 177
matrix(5).weight = 75

上面這段程式碼就只是很簡單的把資料填入,請注意我們只填入身高體重和姓名,接著,再利用底下的程式碼算出BMI:

'計算BMI
For i = 0 To 5
  matrix(i).BmiValue = matrix(i).weight / (matrix(i).height / 100) ^ 2
Next

OK,到這邊先告一個段落,以上都沒有LINQ出現,動作也很簡單,接下來換LINQ出場,在出場前先問讀者一個問題,如果要找出BMI值>25的資料,你會怎麼寫程式?

...

沒錯,用for each指令,在沒有LINQ功能的時代,我們只能用陣列巡覽的方式查找每一個元素,找出符合的資料,但是有底下幾個問題:
1.為了找出特定的資料而跑整個陣列,看起來挺蠢的。(不過說真的,如果資料沒有排序,也就只能那麼蠢)
2.可能有一些初學的菜鳥程式設計師,寫出效率很差的查找程式。(例如不小心在for each當中做了一些不必要的動作)

OK,過去我們對於物件(或是物件陣列)的操作,也就只能使用迴圈的方式,但是LINQ提出了一種新的可能,就是透過類似SQL的查找語法,讓開發人員可以用簡單的程式碼,就可以針對物件進行複雜的查詢。(更重要的是,未來這種簡單的查找語法變成主流之後,可以用以查詢"各種不同的對象",而不只有查找"物件")

言歸正傳,若要查找出BMI值>25的資料,你可以透過底下的LINQ程式:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

結束,就是這樣,而 result 就是找出的結果物件,你可以透過 result 來取得每一個符合條件的資料。簡單的說,上面這段程式碼的意思是,從matrix物件集合當中,找出一些資料,這些資料的BmiValue屬性大於25。其中的 c 只是撰寫程式碼方便,c代表該物件元素,你也可以用別的字眼..

而找出的資料result也是一個集合,你可以透過底下的程式碼來列出每一個BMI值符合條件者的名字:

'顯示名稱
For Each item In result
  MsgBox(item.name)
Next

很簡單不是嗎? result 當中的每一個 item ,其型別就是 BMI,因為Result物件是LINQ語法跑出的結果,所以只有包含符合 BmiValue > 25 這個條件的人...

上面這段程式碼,還可以這樣寫...

'顯示名稱
For Each item In (From c In result Select c.name)
  MsgBox(item)
Next

效果完全一樣唷,但是,(From c In result Select c.name) 會產生一個物件,該物件只有符合條件者的名稱(相當於一維陣列),而item的型別當然就是string。

透過上面這樣的指令,查找動作變得相當簡單,還不僅如此,關鍵在於底下這樣的語法:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

具有相當多不同的變化方式,可以組合出各種不同的形式,發揮出強大的查找力量,再加上學一次,就可以用在各種不同的地方(這邊我們只用來查找物件,其實也可以查找XML和Database),使得LINQ的用途更加的廣泛,這就是LINQ的價值與意義。

以後,再跟大家分享一些關於LINQ的其他部分,希望對大家有幫助,VB developer其實是幸福的,LINQ其實是很簡單的...

2008年6月17日 星期二

Silverlight 2.0 beta 2 繁體中文版開發工具

很難得的,Silverlight 2.0在Beta 2的版本就看到了專屬的中文版開發套件(SDK),不禁令人感動不已,在這要先給台灣微軟、Moli、以及辛苦的RD同仁一個大大的掌聲。


帶著興奮的心情,趕快下載來試用一下,咦?安裝時間有點長唷,比英文版的長了不少...???不過沒關係,總是裝完了,來試試看。喔~連建立專案範本的對話視窗都是繁中的,真是太感動了。再把前幾天開發的那個紅綠燈控件拿來給它試試看,看起來不錯唷,配合VS2008繁體中文版,一切相當順暢,沒啥大問題。所以,很放心的跟大家分享囉。

連建立專案範本的對話視窗都是繁中的呢,真是令人動容啊...


安裝過程也是繁中的唷...



Microsoft Silverlight Tools Beta 2 for Visual Studio 2008繁體中文版下載位置:
http://www.microsoft.com/downloads/details.aspx?FamilyID=50a9ec01-267b-4521-b7d7-c0dba8866434&displaylang=zh-tw


後記:說真的,我還是習慣繁體中文版的操作環境,大概因為我不是那種喝過多年洋墨水的歸國學者,也還沒有去"內地"待過太久...不過,雖然由於工作的需要,活在英文、繁中、簡中的各種混雜文件和郵件之中已經是常態,但是英文和簡中文字給我的感動總是少之又少,頂多就是理解意思而已,而繁中文字給我的親切與情感,恐怕是其他文字很難取代的,不過寫到這裡,也有一點小小的擔心,隨著使用人口的變少,不知道未來十年二十年之後,繁體中文的命運會如何? (最近聽說有人還在台灣學京片子,會不會哪天也開始學簡體字???) 隨著大家(包含我自己偶而也不小心)把資料庫稱為數據庫、把呼叫稱為調用、把控制項稱為控件...我的憂心越來越多...

後記二:很多人問到安裝問題,請注意,要移除所有的Silverlight beta、SDK、1.0,總之移除所有跟Silverlight字眼有關的東西,才能安裝Silverlight_Chainer.exe

建立Silverlight 2.0 控件(User control)


Silverlight 2.0有一個非常重要的部分,就是控件技術的出現,透過可自行定義開發的控件建立機制,Silverlight 和 ASP.NET一樣,可以自行定義可重用的 UserControl,這對於開發人員有著相當重要的意義,這表示物件化的設計、ReUse與大量的開發開始變的可能。

有這些作為基礎,我們才有可能真正透過Sivlerlight 2.0建立中大型的應用程式或是RIA,也才有可能確保投資可以延續並且在團隊開發當中累積資源。

這麼重要的機制,當然要給他試用一下,左圖是我嘗試建立的traffic light控件,模擬一個紅綠燈,一樣具有屬性、事件、方法...可以跟外部的程式互動,畫面中的Button和TextBox則是Silverlight 2.0當中本來就有的控件,透過.NET Code的開發方式,你可以用C#或是VB,確實比過去1.0時代用JavaScript和AJAX方便很多。

在該控件在被使用者點選之後,會觸發一個Click事件,這個事件是我們自己建立出來的,我們可以在這個事件當中改變TextBox內的值(你試用看看就知道)。當然,我們也可以在其他控件(例如按鈕)當中來改變燈號(透過traffic light控件的屬性),總而言之,這就是一個標準的控件啦。

您可以點選[這裡]測試一下這個控件,關於程式碼的說明我會在七月的Run!PC當中介紹,如果您需要Source Code,請私下偷偷Mail給我。

2008年6月12日 星期四

Silverlight 2.0 beta 2

你知道Silverlight 2.0 beta 2推出了嗎? 是的,又是一缸子的增強,但是安裝檔案卻沒有膨脹,有哪些改變呢?

第一個,控件變多了,目前已經內建多達30多個,而且根據S老大的說法,未來預計提供100多個控件,是.....怎樣,有沒有搞錯???比ASP.NET還多? 而且設計好的控件還可以自行調整外觀卻不會需要動到控件源碼。(這個特性未來有時間我在寫一個範例介紹)

另外Sockets也支持跨網域了,同時也支援與伺服器端的WCF建立一個雙向通道,透過這樣的機制,不僅Client端可以向伺服器端要資料,伺服器端也可以主動把訊息推送到Client端。

同時,Silverlight beta 2也直接支援了ADO.NET Data Services,不用像3月時我在微軟研討會上寫那麼複雜的程式才能夠調用到遠端ADO.NET Data Services,使用上更便利了。如此一來,使用遠端資料庫裡面的資料完全不是問題。

另外,DataBinding也增強了,很多學員在Silverlight 1.0時代所面對的資料庫Issue現在可輕鬆的解決,這些內容,我會另外寫些範例和短文介紹。

至於Silverlight 2.0 該如何使用、怎麼著手開發、我在這個月的Run!PC已經有說明,如果讀者有興趣可以參考。


2008年6月9日 星期一

很讓人警醒的一段程式碼...^_^

這幾天重新看過去的email,看到有一位讀者寫過一封信,信件最後的簽名檔當中,發現了一段程式碼,非常非常有創意,還可以做為座右銘,真的超級有趣..

if (me.today == me.yesterday) me.tomorrow = null;

我這輩子第一次看到這麼發人深省的程式碼,特別取得作者同意與大家分享...^_^

2008年6月8日 星期日

再看New Mondeo的CF與軟體開發人員

我是mitsubishi的支持者,主要的原因是全系列的手自排和競裝的運動款車系,截至目前為止,我還是覺Galant和Lancer IO是房車裡面外觀最吸引我的(Grounder就別提了...-_-'''),而且根據調查,駕駛者購買的第一台車,很可能會影響該駕駛人未來的開車喜好和選擇。

OK,也就是說,你選擇了mitsubishi很可能一輩子就不選Ford了...

也因此,你會看到坊間常常鼓勵你去試駕,還送東送西的,主要目的就是改變你的第一印象,因為這個很重要,重新回頭來談這件事情,車商在如此不景氣的高油價時代,已經很難生存,還得花時間花大錢拍廣告,可見Marketing在他們心中有多重要...

我一開始不覺得...我越看New Mondeo那支廣告就越覺得是這樣...這麼說好了,比起New Mondeo這支CF,mitsubishi賣無敵鐵金剛的哪支就整個遜掉了(以前女兒和爸爸系列的就很讚),它造成的問題是,我開始上Ford的網站,稍稍看了一下New Mondeo的介紹,這一看不得了,你會發現很多功能(特性)是你想要的,如果我們沒有上Ford的網站,我可能永遠只會乖乖的選mitsubishi,New Mondeo就和我無緣了...

而這一切的改變,就是從一支CF開始...

不過,New Mondeo還要等我幾年,我現在沒錢買,也不想買,等到哪一天我可以富有到不用在乎油價的時候...我才會考慮...不過那時候可能全球已經沒油了,更有可能的是我根本等不到那一天...

不過我要強調的是,原來廣告的力量就在這裡,學軟體開發的我們,可能不容易發現這類動作的影響力有如此之大,其實,在台灣身為工程師,你也需要投入到專案當中,可能你也需要面對客戶,甚至你根本就很可能是presale,需要在客戶面前present,也有可能你的開發產品是一個套裝軟體,在軟體界,做的起也唯一讓人看得出來有在做marketing的就是MS,其他 Local廠商可能吃都吃不飽了,還得花錢去Marketing咧,可能想都別想,不過,你無可避免的發現,這個力量是大的...

所以身為技術人員的我們,可能參與另一種形式的Marketing來Promote我們的產品,例如研討會啦、世貿展啦、我強烈的建議技術人員盡量參與這些場合和機會,別天天悶在座位面前寫程式,你乖乖的做在電腦面前寫程式可能很爽(我也超愛寫程式的時候,The Moment is perfect),也可以領一點微薄的薪水,但是這個世界的潮流不會因為你而改變,偶而爭取一點機會,從另一個角度看看這個世界,從另一個角度看看你熟悉的軟體業,看看那些講師、那些Sales、Presale在幹些什麼,對於已經相當熟悉開發整天跟技術為伍的Developer,會有相當大的幫助,而且,好的idea常常從市場面來,而非從實驗室。

說真的,寫程式很有趣,但是...也僅僅是有趣而已。

福特廣告CF:


三菱廣告:

2008年6月1日 星期日

City of angels

又看到了另一個版本的Angels,這首歌歷久不衰,好歌和好電影,似乎不會因為時光的消逝,而折損它的一絲光彩。好聽就是好聽,沒話說...

City of angels,是我很喜歡的電影,如果你跟我一樣看過,大概還記得片中的情節,塞斯最後問 上帝為什麼,在千辛萬苦讓自己可以接觸到瑪姬後,卻讓這一切發生,彷彿賽斯所有的努力都是徒然,彷彿上帝讓這一切接近以報應的方式臨到,彷彿在嘲笑著賽斯的自作聰明和荒唐...

為什麼會這樣?不知道...沒有人知道上帝的旨意和安排會是如何...你的汲汲營營,最後可能只是徒然...
但是這終究是你的選擇...不是嗎? Freewill ~

最後一幕如果我沒記錯在海邊,天使們聆聽天籟,賽斯躍入大海,體驗過去身為天使卻無法感受到的一切...

人生有時候似乎就是這樣,你真的不知道下一刻會發生什麼...

如果你也看過這部片,有些片段,可以讓你回憶一下: