轉(zhuǎn)貼:MSDN訪談錄C#編程之4
發(fā)表時(shí)間:2023-08-01 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]ROBERT HESS: 當(dāng)作一個(gè)標(biāo)準(zhǔn)的For循環(huán)? JEFFREY RICHTER:對(duì),當(dāng)作一個(gè)標(biāo)準(zhǔn)的For循環(huán)。因此有時(shí)到了最后,它所做工作比我當(dāng)初想象的還要多。使用foreach是相當(dāng)常見(jiàn)的,...
ROBERT HESS: 當(dāng)作一個(gè)標(biāo)準(zhǔn)的For循環(huán)?
JEFFREY RICHTER:對(duì),當(dāng)作一個(gè)標(biāo)準(zhǔn)的For循環(huán)。因此有時(shí)到了最后,它所做工作比我當(dāng)初想象的還要多。使用foreach是相當(dāng)常見(jiàn)的,有了它實(shí)在是很爽。
ROBERT HESS:我猜您本來(lái)也應(yīng)當(dāng)在那里放置一個(gè)計(jì)數(shù)器,不過(guò)這會(huì)完全使foreach不起作用。
JEFFREY RICHTER: 是的,很正確。
ROBERT HESS:那么,您認(rèn)為C#還另外具有什么樣很酷特性,以讓觀眾說(shuō),好,這就是我要選的語(yǔ)言?
JEFFREY RICHTER:嗯,正如Anders在前面指出,C#是完全基于組件的,在那里具有事件,具有接口,具有屬性,它們都是一等公民,所以沒(méi)有下滑杠,沒(méi)有下滑杠屬性等任何類似的東西。出身于C#的人應(yīng)當(dāng)熟悉異常處理,因?yàn)橛龅藉e(cuò)誤時(shí),就調(diào)用在基類庫(kù)中的framework里的錯(cuò)誤處理程序。因此我在屏幕上寫了一小塊代碼,以示范如何進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理。我具有一個(gè)try語(yǔ)塊,再?gòu)?qiáng)調(diào)一下,您應(yīng)注意在try這個(gè)單詞的前面沒(méi)有下滑杠,因?yàn)樵贑#語(yǔ)言中它位于第一階層。我new一個(gè)文件流對(duì)象,這是打開(kāi)磁盤里的文件的一種方式。而在雙引號(hào)里,我給出了我們希望打開(kāi)的文件的路徑名。
using System;
using System.IO;
public class App {
public static void Main() {
FileStream fs = null;
try {
fs = new FileStream(@"C:\NotThere.txt", FileMode.Open);
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
finally {
if (fs != null) fs.Close();
}
}
}
ROBERT HESS:等等,那是一個(gè)錯(cuò)誤,是嗎?
JEFFREY RICHTER:不,這正是我要指出的。因?yàn)镃#有一個(gè)非常酷的特性,可以給字符串加上一個(gè)@符號(hào)的前綴,使我們轉(zhuǎn)用原義字符串(verbatimstring,即真正的字符串,不加任何轉(zhuǎn)義符),這里只允許使用單反斜杠“\”而不是雙反斜杠“\\”。而長(zhǎng)路徑實(shí)在是一種十分常見(jiàn)的C++編程錯(cuò)誤,人們以反斜杠代替雙反斜杠,文件就不能正確地打開(kāi)。在這種情況下應(yīng)用加上"\n",意思是要換行。所以,這實(shí)在是一個(gè)巧妙的特性。不象一個(gè)file stream,因?yàn)槿藗兪煜in32的CreateFile函數(shù),當(dāng)該函數(shù)無(wú)法打開(kāi)一個(gè)文件時(shí)就會(huì)返回?zé)o效的句柄值,或返回-1意味著失敗。在.NET framework中,當(dāng)我企圖打開(kāi)一個(gè)不存在的文件時(shí),就會(huì)引發(fā)一個(gè)異常,所以我在這里設(shè)置了一個(gè)catch語(yǔ)塊,設(shè)法捕獲到異常,這是一個(gè)非常簡(jiǎn)單的catch語(yǔ)塊,只把信息輸出屏幕,看看可能做了些什么,接著我又設(shè)置了一個(gè)finally語(yǔ)塊,在這里的代碼要確保能執(zhí)行,因此假如我在try語(yǔ)塊中有很多行真正涉及到文件操作的代碼,在打開(kāi)文件之后,finally語(yǔ)塊就會(huì)執(zhí)行并在最后明確地關(guān)閉文件。這實(shí)在是一種很巧妙的特性,Win32甚至是C++也不曾擁有,它能夠使try,catch和finally渾然一體,真正算起來(lái),這種操作我們以前從未遇見(jiàn)過(guò)。
ROBERT HESS:我認(rèn)為當(dāng)應(yīng)用程序變得越來(lái)越復(fù)雜時(shí),人們?cè)谄渲羞M(jìn)行錯(cuò)誤處理是相當(dāng)重要的,當(dāng)企圖創(chuàng)建文件或進(jìn)行類似的操作時(shí),出錯(cuò)的機(jī)會(huì)可能會(huì)很多。尤其是使用其他人的對(duì)象和類似的東西時(shí)。
那么,這是不是意味著在編寫C#的應(yīng)用程序時(shí),您必須保證函數(shù)和方法都能正確地設(shè)置異常并拋出一個(gè)異常,以便人們可以捕獲它?
JEFFREY RICHTER:嗯,絕對(duì)如此。良好的編程典范規(guī)定:當(dāng)編寫一個(gè)函數(shù)時(shí),必須驗(yàn)證所有傳遞進(jìn)來(lái)的參數(shù),如果任何一個(gè)參數(shù)不合乎要求,就應(yīng)當(dāng)明確地引發(fā)一個(gè)異常,而在基類庫(kù)中定義有大量的異常類,所以可以輕而易舉地使用其中的一個(gè)。但是您同樣也有能力定義自己的異常類,或許,要查找數(shù)據(jù)庫(kù)中的、顧客(customer),卻好象沒(méi)有發(fā)現(xiàn)他們的名字,故可以創(chuàng)建自己的customer異常,并在代碼里的某個(gè)地方引發(fā)它。
ROBERT HESS:或許會(huì)用類似customer的名字作為損壞的customer名……
JEFFREY RICHTER:是的,大概這樣。如果它是"Robert",就是你一直想要引發(fā)的異常。
ROBERT HESS:那么,您認(rèn)為C#作為一種編程語(yǔ)言將如何發(fā)展?當(dāng)您的客戶參加培訓(xùn)時(shí)您對(duì)他們有什么點(diǎn)撥,他們對(duì)此又有什么想法?
JEFFREY RICHTER:嗯,我真的認(rèn)為它將獲得巨大的動(dòng)力。我說(shuō)過(guò),去年我一直專門用C#編程,偶爾也用C++,但現(xiàn)在卻很少用了,而我相信許多VB程序員也將會(huì)轉(zhuǎn)向此語(yǔ)言,因?yàn)镃#更適合公共語(yǔ)言運(yùn)行庫(kù)。所以,我真的認(rèn)為它將獲得巨大的動(dòng)力,并且真正得到重用。在我的培訓(xùn)班里,似乎每個(gè)人都喜歡它,事實(shí)上一些人說(shuō)他們參加這個(gè)培訓(xùn)班,只是由于這個(gè)班開(kāi)設(shè)了C#編程的課,但很快他們就高興地發(fā)現(xiàn)課程也涵蓋了framework和類庫(kù)。
ROBERT HESS:那么,當(dāng)談到.NET framework和類庫(kù)時(shí),您認(rèn)為它們?cè)趺礃樱约八鼈兪窃鯓訋椭鷳?yīng)用程序開(kāi)發(fā)的?
JEFFREY RICHTER:我認(rèn)為,這個(gè)平臺(tái)表現(xiàn)很出色。我使用整個(gè)平臺(tái)已經(jīng)一年了,并且我最近一直在為微軟開(kāi)發(fā)一個(gè)項(xiàng)目,以展示微軟的許多技術(shù)。我和另外一個(gè)家伙一起工作,他的名字叫Tom,我們要在早上碰頭,要在電子白板上繼續(xù)討論,接著要…… 這里就是我們今天將要補(bǔ)充說(shuō)明的性能,我們又要討論一會(huì)兒,我們要表示,這就是當(dāng)天結(jié)束時(shí)我們的目標(biāo),通常在午飯之前我們要全部完工。我們總是超額地完成了任務(wù)。
ROBERT HESS:您認(rèn)為C#和.NET的結(jié)合有助于完成工作嗎?
JEFFREY RICHTER: 噢,當(dāng)然。毫無(wú)疑問(wèn),因?yàn)樗械臏y(cè)試都已完成。所有的測(cè)試——我們?nèi)绾喂_(kāi)這個(gè)東西,我們能不能使這成為一個(gè)方法,能不能把它放在DLL里,能不能使其成變COM 對(duì)象,我們應(yīng)擁有什么類型的接口。所有的這些問(wèn)題涉及到您如何把這些連接起來(lái)并傳遞指針,保持連接以便可以同步,所以您就可以通過(guò)保持和其他人同步來(lái)通知他們,所有這些論點(diǎn)都剛剛被引進(jìn)該平臺(tái)。因此,自始至終地,我們?cè)敢夤ぷ饕粋(gè)小時(shí),我們要完成某項(xiàng)工作,我們會(huì)……,然后我們又要坐回去并開(kāi)始增加其它的東西。我們的生產(chǎn)率如何,確實(shí)令人難于置信,而且也同樣充滿著樂(lè)趣。我們確實(shí)增加了驚人的圖形圖像庫(kù)和alpha混色(blending)以及所有類型的東西,這些以前我們從未處理過(guò)alpha混色此類東西。我曾經(jīng)從事過(guò)圖形圖像的工作,但已經(jīng)過(guò)了好多年了。而利用相應(yīng)名字空間中的system.drawing語(yǔ)句,我們就能夠構(gòu)造這些圖像并對(duì)它們進(jìn)行覆蓋和alpha混色,然后又從我們的web服務(wù)器返回這些圖像給在任何機(jī)器上運(yùn)行的任一客戶,甚至不必是一臺(tái)Windows機(jī)器。
ROBERT HESS:我想這帶來(lái)了有利的選擇。迄今為止,我們一直在談?wù)撚肅#和.NET framework等進(jìn)行應(yīng)用程序的開(kāi)發(fā),并且我了解到您原來(lái)就是一個(gè)貨真價(jià)實(shí)的應(yīng)用程序設(shè)計(jì)師,編寫Windows應(yīng)用程序和標(biāo)準(zhǔn)的GUI程序。令人意外的是web出現(xiàn)了,因此每個(gè)人都想到編寫web應(yīng)用程序,或編寫運(yùn)行在瀏覽器內(nèi)部基于HTML的應(yīng)用程序。但現(xiàn)在以一句話對(duì)您的產(chǎn)品進(jìn)行概括,您正在談到具有這種alpha合成標(biāo)準(zhǔn)的Windows圖形應(yīng)用程序,也談到了訪問(wèn)web并以相應(yīng)的格式返回給其它系統(tǒng)。那么象您我這樣的Win32應(yīng)用程序開(kāi)發(fā)者,對(duì)傳統(tǒng)的應(yīng)用程序開(kāi)發(fā)環(huán)境以及新的web應(yīng)用程序與.NET的混合有什么看法?
JEFFREY RICHTER:嗯,我實(shí)際上在做的就是這種特別的事情,它不是Win32圖形應(yīng)用程序,而是一個(gè)web窗體(form),隨意一個(gè)web窗體。
ROBERT HESS:那么它甚至也不是一個(gè)傳統(tǒng)的Windows應(yīng)用程序嗎?它聽(tīng)起來(lái)很象啊。
JEFFREY RICHTER:嗯,它真正是什么?實(shí)際上它比傳統(tǒng)的Win32程序具有更復(fù)雜的體系。它實(shí)際是一個(gè)web服務(wù),并且我認(rèn)為它是第一批公用微軟web服務(wù)(public Microsoft web services)之一,是免費(fèi)的,所以我會(huì)給出URL地址。因此誰(shuí)都可到那里去擺弄擺弄,這個(gè)地址是teraserver.Microsoft.net。
ROBERT HESS:噢,我會(huì)把這個(gè)地址放在本記錄稿的后面,以便大家點(diǎn)擊訪問(wèn)。
JEFFREY RICHTER:那里有許多微軟技術(shù)的廣告宣傳,其中包括Windows 2000 Datacenter、SQL 2000、IIS、ASP.net、.NET frameworks、web services和web forms。所在的資料都在那個(gè)網(wǎng)站上。有一個(gè)具有圖像信息的teraserver web服務(wù),它顯示立體地形圖和常規(guī)像片里的圖像和標(biāo)題。而且我們也有一個(gè)人口普查(census)服務(wù),所以可以到那里輸入緯度、經(jīng)度等,便得到相應(yīng)的城市名以及生活在該地區(qū)的人口。我們還有地標(biāo)(landmark)服務(wù),給出一個(gè)以經(jīng)緯度標(biāo)定的矩形區(qū),就可以找到該地區(qū)范圍內(nèi)的醫(yī)院和學(xué)校。因此,它們是三個(gè)單獨(dú)的web 服務(wù)。它們本來(lái)可以由不同的公司實(shí)現(xiàn),但實(shí)際上都是由我們實(shí)現(xiàn)的。接著我們編寫了一個(gè)web窗體應(yīng)用程序,它本來(lái)可以由任何公司編寫,但這次又由我們編寫,以便弄清概念,它向這三個(gè)不同的web服務(wù)發(fā)出信息,接著從teraserver獲取標(biāo)題信息,從landmark服務(wù)器獲取地標(biāo)信息,然后我們就能夠把這些信息載入地圖。
ROBERT HESS:使用alpha混色。
JEFFREY RICHTER:嗯,對(duì),使用alpha混色。于是,這些信息被送回web窗體,送回運(yùn)行在任何機(jī)器上的客戶。我們甚至可以增加這樣的功能,當(dāng)鼠標(biāo)移到某東西上方時(shí),提示工具將會(huì)顯現(xiàn)并告訴您該網(wǎng)頁(yè)上相應(yīng)的學(xué)校名和醫(yī)院名。此范例功能之強(qiáng)大,簡(jiǎn)直令人無(wú)法相信。事實(shí)上客戶可以是運(yùn)行任何操作系統(tǒng)的任何機(jī)器,并且我們?cè)诜⻊?wù)器端利用Windows 2000的GDI+性能處理alpha混色,以及此類高級(jí)圖形操作,不過(guò)我們只把位圖(bit map)送回給客戶,我再次認(rèn)為,其功能之強(qiáng)大、生產(chǎn)率之高,簡(jiǎn)直令人信難于置信。而且我也了解到許多應(yīng)用正在朝這個(gè)方向發(fā)展。
ROBERT HESS:所以您真的很喜歡web應(yīng)用程序的整個(gè)web模型。
JEFFREY RICHTER: 喜歡。
ROBERT HESS:即使您是一個(gè)傳統(tǒng)的Windows應(yīng)用程序開(kāi)發(fā)者。
JEFFREY RICHTER: 是的。
ROBERT HESS:您現(xiàn)在已橫下心來(lái)要朝這個(gè)方向發(fā)展了。
JEFFREY RICHTER:是的,我已下決心了。程序要能在任何地方運(yùn)行,并在服務(wù)器上進(jìn)行工作。所有的這些便構(gòu)成了所謂的分布式系統(tǒng)(distributedness),服務(wù)器可以位于三臺(tái)不同的機(jī)器,噢,維護(hù)所有的這些資料的SQL Server還可以是另一臺(tái)機(jī)器,web 窗體服務(wù)器也位于不同的機(jī)器,并且還可以被不同的公司細(xì)調(diào)以便隨意使用這些材料,他們覺(jué)得這些材料適合于生成內(nèi)容豐富的應(yīng)用程序,而這些程序運(yùn)行在能被internet訪問(wèn)到的任何地方。這簡(jiǎn)直令人難于置信,確實(shí)難于置信!
ROBERT HESS:某些跡象告訴我,所有的這些東西給您留下了現(xiàn)象。
JEFFREY RICHTER:是的,有點(diǎn)。
ROBERT HESS:那么,對(duì)于觀眾中躍躍欲試的開(kāi)發(fā)人員,他們想要投身于C#,并要開(kāi)始編寫一些.NET應(yīng)用程序,在他們跨出第一步之前,需要真正地了解什么?您認(rèn)為最后還有什么要強(qiáng)調(diào)的?
JEFFREY RICHTER:我認(rèn)為,這些開(kāi)發(fā)人員即將面臨的一個(gè)最大問(wèn)題就是,他們必須認(rèn)識(shí)到是C#語(yǔ)言揭示了runtime和基類庫(kù)中的性能,或許假以時(shí)日他們會(huì)從經(jīng)驗(yàn)中學(xué)到。而許多人將會(huì)關(guān)注C#,也可能他們會(huì)試一試,或關(guān)注其它的.NET語(yǔ)言,也有可能會(huì)企圖做一些不被這些語(yǔ)言所支持的事,接著當(dāng)然認(rèn)為這是不可能的。例如:在C#中,所有的數(shù)組默認(rèn)都是基于0的,是以0索引(下標(biāo))開(kāi)始的。但是公共語(yǔ)言運(yùn)行庫(kù)支持?jǐn)?shù)組有任何的下邊界和上邊界。在基類庫(kù)中構(gòu)造了一個(gè)數(shù)組,它具有所設(shè)定的上下邊界。但是C#自然不提供這些功能。因此,您必須去學(xué)習(xí),隨著時(shí)間的推移,就會(huì)了解它是什么,很多時(shí)候您或許可以使用其它語(yǔ)言,或者去訪問(wèn)語(yǔ)言的底層系統(tǒng),語(yǔ)言是位于runtime頂端的,由于某些原因,設(shè)計(jì)者不讓我們?nèi)ピL問(wèn)底層系統(tǒng)。
ROBERT HESS:似乎就是這樣,通過(guò)理解runtime底層的所有性能,然后您就可以把這些性能映射(map)給您目前正在使用的任何語(yǔ)言,以便了解它們是否提供給您所需要的功能。例如,我寫網(wǎng)頁(yè)時(shí)總是用純粹的HTML編寫,因?yàn)槲抑浪木唧w功能是什么。但是假如我必須用FrontPage寫,我知道FrontPage有它自己的格式(mindset),關(guān)系到網(wǎng)頁(yè)的顯示,并且我知道它能給我提供什么,不能提供什么。偶爾我也不得不轉(zhuǎn)回純粹的HTML并按這種方式增加某些東西或其它工具,這似乎是同樣的事情。
JEFFREY RICHTER:有時(shí)在C#中也有這些功能,但卻以不同的名字出現(xiàn),例如,在公式語(yǔ)言庫(kù)中,虛擬函數(shù)被稱為family 。于是要在C#中創(chuàng)建一個(gè)虛擬函數(shù),就會(huì)用protected 限定。對(duì),或不用protected,但是在C#中的protected是等價(jià)于公共語(yǔ)言運(yùn)行庫(kù)中的family的。噢,搞混了。看看,連我自己也糊涂了。
ROBERT HESS:因此基本的思路聽(tīng)起來(lái)好象就是要去理解您正在使用的工具,以及它們?cè)?NET framework底層的運(yùn)行情況。好了,非常感謝Jeffery,又與您交談我感到非常榮幸,以后我會(huì)找一個(gè)時(shí)間再次邀請(qǐng)您回來(lái)參加這個(gè)“show”節(jié)目的。
JEFFREY RICHTER:好,我很樂(lè)意,謝謝。
ROBERT HESS:這就是程序員Jeffery對(duì)C#和.NET framework的看法。他提供給你們一些好資料,以讓你們了解更新的開(kāi)發(fā)領(lǐng)域。他講到了很多的URL地址和源代碼例子以及類似的資料。我保證把它們放在本記錄稿的后面,所以請(qǐng)繼續(xù)觀看其余的“show”節(jié)目,看看還有什么內(nèi)容。
……(略去與C#無(wú)關(guān)的談話)
結(jié)束語(yǔ)
ROBERT HESS:謝謝您參加另一期的MSDN Show。這一次我們討論了用C#編程的問(wèn)題。
ERICA WIECHERS:在下一期的MSDN Show節(jié)目里,我們將談?wù)揝OAP以及它是如何被整合到.NET編程體系的。
ROBERT HESS: 到那時(shí),我們?cè)僭诰W(wǎng)上見(jiàn)面。
更多資料的鏈接
Microsoft C#資料:C#綜述和介紹(Overview and Introduction to C#,http://msdn.microsoft.com/vstudio/nextgen/technology/csharpintro.asp)
C#語(yǔ)言規(guī)范(C# Language Specification,http://spectre/test/library/default.asp?URL=/library/dotnet/csspec/vclrfcsharpspec_Start.htm)
MSDN之聲:深入C#專欄(MSDN Voices: Deep C# column,http://msdn.microsoft.com/voices/deepc.asp)
一個(gè)定期的專欄,在這里Bobby Schmidt分享他使用C#的觀點(diǎn)和見(jiàn)識(shí)。
MSDN .NET開(kāi)發(fā)者中心(MSDN Developer Center for .NET,http://msdn.microsoft.com/net/)
提供更多有關(guān).NET技術(shù)的開(kāi)發(fā)資料。
C#新聞組(C# Newsgroup,news://msnews.microsoft.com/microsoft.public.dotnet.languages.csharp)
與正在學(xué)習(xí)使用C#的人互相討論、互相請(qǐng)教。
有關(guān)Jeffrey Richter談話的資料:
代碼范例(Sample Code:地址不詳)
書: Windows Programming Applications for Microsoft
Windows Programming Server-Side Applications for
(和Jason Clark合寫)
Wintellect(http://www.wintellect.com/,)
Jeffrey 的培訓(xùn)和咨詢公司。
TerraServer.NET(http://terraserver.microsoft.net/)
Jeffrey幫助編寫的mapping服務(wù)。
Jeffrey Richter的主頁(yè)(http://www.jeffreyrichter