轉貼:MSDN訪談錄C#編程之四

來源:互聯網
上載者:User
編程 ROBERT HESS: 當作一個標準的For迴圈?

JEFFREY RICHTER:對,當作一個標準的For迴圈。因此有時到了最後,它所做工作比我當初想象的還要多。使用foreach是相當常見的,有了它實在是很爽。

ROBERT HESS:我猜您本來也應當在那裡放置一個計數器,不過這會完全使foreach不起作用。

JEFFREY RICHTER: 是的,很正確。

ROBERT HESS:那麼,您認為C#還另外具有什麼樣很酷特性,以讓觀眾說,好,這就是我要選的語言?

JEFFREY RICHTER:嗯,正如Anders在前面指出,C#是完全基於組件的,在那裡具有事件,具有介面,具有屬性,它們都是一等公民,所以沒有下滑杠,沒有下滑杠屬性等任何類似的東西。出身於C#的人應當熟悉異常處理,因為遇到錯誤時,就調用在基底類別庫中的framework裡的錯誤處理程式。因此我在螢幕上寫了一小塊代碼,以示範如何進行適當的錯誤處理。我具有一個try語塊,再強調一下,您應注意在try這個單詞的前面沒有下滑杠,因為在C#語言中它位於第一階層。我new一個檔案流對象,這是開啟磁碟裡的檔案的一種方式。而在雙引號裡,我給出了我們希望開啟的檔案的路徑名。
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:等等,那是一個錯誤,是嗎?

JEFFREY RICHTER:不,這正是我要指出的。因為C#有一個非常酷的特性,可以給字串加上一個@符號的首碼,使我們轉用原義字串(verbatim  string,即真正的字串,不加任何轉義符),這裡只允許使用單反斜線“\”而不是雙反斜線“\\”。而長路徑實在是一種十分常見的C++編程錯誤,人們以反斜線代替雙反斜線,檔案就不能正確地開啟。在這種情況下應用加上"\n",意思是要換行。所以,這實在是一個巧妙的特性。不象一個file stream,因為人們熟悉Win32的CreateFile函數,當該函數無法開啟一個檔案時就會返回無效的控制代碼值,或返回-1意味著失敗。在.NET framework中,當我企圖開啟一個不存在的檔案時,就會引發一個異常,所以我在這裡設定了一個catch語塊,設法捕獲到異常,這是一個非常簡單的catch語塊,只把資訊輸出螢幕,看看可能做了些什麼,接著我又設定了一個finally語塊,在這裡的代碼要確保能執行,因此假如我在try語塊中有很多行真正涉及到檔案操作的代碼,在開啟檔案之後,finally語塊就會執行並在最後明確地關閉檔案。這實在是一種很巧妙的特性,Win32甚至是C++也不曾擁有,它能夠使try,catch和finally渾然一體,真正算起來,這種操作我們以前從未遇見過。

ROBERT HESS:我認為當應用程式變得越來越複雜時,人們在其中進行錯誤處理是相當重要的,當企圖建立檔案或進行類似的操作時,出錯的機會可能會很多。尤其是使用其他人的對象和類似的東西時。
    那麼,這是不是意味著在編寫C#的應用程式時,您必須保證函數和方法都能正確地設定異常並拋出一個異常,以便人們可以捕獲它?

JEFFREY RICHTER:嗯,絕對如此。良好的編程典範規定:當編寫一個函數時,必須驗證所有傳遞進來的參數,如果任何一個參數不合乎要求,就應當明確地引發一個異常,而在基底類別庫中定義有大量的異常類,所以可以輕而易舉地使用其中的一個。但是您同樣也有能力定義自己的異常類,或許,要尋找資料庫中的、顧客(customer),卻好象沒有發現他們的名字,故可以建立自己的customer異常,並在代碼裡的某個地方引發它。

ROBERT HESS:或許會用類似customer的名字作為損壞的customer名……

JEFFREY RICHTER:是的,大概這樣。如果它是"Robert",就是你一直想要引發的異常。


ROBERT HESS:那麼,您認為C#作為一種程式設計語言將如何發展?當您的客戶參加培訓時您對他們有什麼點撥,他們對此又有什麼想法?

JEFFREY RICHTER:嗯,我真的認為它將獲得巨大的動力。我說過,去年我一直專門用C#編程,偶爾也用C++,但現在卻很少用了,而我相信許多VB程式員也將會轉向此語言,因為C#更適合公用語言運行庫。所以,我真的認為它將獲得巨大的動力,並且真正得到重用。在我的培訓班裡,似乎每個人都喜歡它,事實上一些人說他們參加這個培訓班,只是由於這個班開設了C#編程的課,但很快他們就高興地發現課程也涵蓋了framework和類庫。


ROBERT HESS:那麼,當談到.NET framework和類庫時,您認為它們怎麼樣,以及它們是怎樣輔助應用程式開發的?

JEFFREY RICHTER:我認為,這個平台表現很出色。我使用整個平台已經一年了,並且我最近一直在為微軟開發一個項目,以展示微軟的許多技術。我和另外一個傢伙一起工作,他的名字叫Tom,我們要在早上碰頭,要在電子白板上繼續討論,接著要…… 這裡就是我們今天將要補充說明的效能,我們又要討論一會兒,我們要表示,這就是當天結束時我們的目標,通常在午飯之前我們要全部完工。我們總是超額地完成了任務。

ROBERT HESS:您認為C#和.NET的結合有助於完成工作嗎?

JEFFREY RICHTER: 噢,當然。毫無疑問,因為所有的測試都已完成。所有的測試——我們如何公開這個東西,我們能不能使這成為一個方法,能不能把它放在DLL裡,能不能使其成變COM 物件,我們應擁有什麼類型的介面。所有的這些問題涉及到您如何把這些串連起來並傳遞指標,保持串連以便可以同步,所以您就可以通過保持和其他人同步來通知他們,所有這些論點都剛剛被引進該平台。因此,自始至終地,我們願意工作一個小時,我們要完成某項工作,我們會……,然後我們又要坐回去並開始增加其它的東西。我們的生產率如何,確實令人難於置信,而且也同樣充滿著樂趣。我們確實增加了驚人的圖形映像庫和alpha混色(blending)以及所有類型的東西,這些以前我們從未處理過alpha混色此類東西。我曾經從事過圖形映像的工作,但已經過了好多年了。而利用相應名字空間中的system.drawing語句,我們就能夠構造這些映像並對它們進行覆蓋和alpha混色,然後又從我們的web伺服器返回這些映像給在任何機器上啟動並執行任一客戶,甚至不必是一台Windows機器。

ROBERT HESS:我想這帶來了有利的選擇。迄今為止,我們一直在談論用C#和.NET framework等進行應用程式的開發,並且我瞭解到您原來就是一個貨真價實的應用程式設計師,編寫Windows應用程式和標準的GUI程式。令人意外的是web出現了,因此每個人都想到編寫web應用程式,或編寫運行在瀏覽器內部基於HTML的應用程式。但現在以一句話對您的產品進行概括,您正在談到具有這種alpha合成標準的Windows圖形應用程式,也談到了訪問web並以相應的格式返回給其它系統。那麼象您我這樣的Win32應用程式開發人員,對傳統的應用程式開發環境以及新的web應用程式與.NET的混合有什麼看法?

JEFFREY RICHTER:嗯,我實際上在做的就是這種特別的事情,它不是Win32圖形應用程式,而是一個web表單(form),隨意一個web表單。
ROBERT HESS:那麼它甚至也不是一個傳統的Windows應用程式嗎?它聽起來很象啊。
JEFFREY RICHTER:嗯,它真正是什嗎?實際上它比傳統的Win32程式具有更複雜的體系。它實際是一個web服務,並且我認為它是第一批公用微軟web服務(public Microsoft web services)之一,是免費的,所以我會給出URL地址。因此誰都可到那裡去擺弄擺弄,這個地址是teraserver.Microsoft.net。
ROBERT HESS:噢,我會把這個地址放在本記錄稿的後面,以便大家點擊訪問。
JEFFREY RICHTER:那裡有許多微軟技術的廣告宣傳,其中包括Windows 2000 Datacenter、SQL 2000、IIS、ASP.net、.NET frameworks、web services和web forms。所在的資料都在那個網站上。有一個具有映像資訊的teraserver web服務,它顯示立體地形圖和常規像片裡的映像和標題。而且我們也有一個人口普查(census)服務,所以可以到那裡輸入緯度、經度等,便得到相應的城市名以及生活在該地區的人口。我們還有地標(landmark)服務,給出一個以經緯度標定的矩形區,就可以找到該地區範圍內的醫院和學校。因此,它們是三個單獨的web 服務。它們本來可以由不同的公司實現,但實際上都是由我們實現的。接著我們編寫了一個web表單應用程式,它本來可以由任何公司編寫,但這次又由我們編寫,以便弄清概念,它向這三個不同的web服務發出資訊,接著從teraserver擷取標題資訊,從landmark伺服器擷取地標資訊,然後我們就能夠把這些資訊載入地圖。

ROBERT HESS:使用alpha混色。


JEFFREY RICHTER:嗯,對,使用alpha混色。於是,這些資訊被送回web表單,送回運行在任何機器上的客戶。我們甚至可以增加這樣的功能,當滑鼠移到某東西上方時,提示工具將會顯現並告訴您該網頁上相應的學校名和醫院名。此範例功能之強大,簡直令人無法相信。事實上客戶可以是運行任何作業系統的任何機器,並且我們在伺服器端利用Windows 2000的GDI+效能處理alpha混色,以及此類進階圖形操作,不過我們只把位元影像(bit map)送回給客戶,我再次認為,其功能之強大、生產率之高,簡直令人信難於置信。而且我也瞭解到許多應用正在朝這個方向發展。


ROBERT HESS:所以您真的很喜歡web應用程式的整個web模型。
JEFFREY RICHTER: 喜歡。

ROBERT HESS:即使您是一個傳統的Windows應用程式開發人員。
JEFFREY RICHTER: 是的。

ROBERT HESS:您現在已橫下心來要朝這個方向發展了。

JEFFREY RICHTER:是的,我已下決心了。程式要能在任何地方運行,並在伺服器上進行工作。所有的這些便構成了所謂的分布式系統(distributedness),伺服器可以位於三台不同的機器,噢,維護所有的這些資料的SQL Server還可以是另一台機器,web 表單伺服器也位於不同的機器,並且還可以被不同的公司細調以便隨意使用這些材料,他們覺得這些材料適合於產生內容豐富的應用程式,而這些程式運行在能被internet訪問到的任何地方。這簡直令人難於置信,確實難於置信!


ROBERT HESS:某些跡象告訴我,所有的這些東西給您留下了現象。


JEFFREY RICHTER:是的,有點。


ROBERT HESS:那麼,對於觀眾中躍躍欲試的開發人員,他們想要投身於C#,並要開始編寫一些.NET應用程式,在他們跨出第一步之前,需要真正地瞭解什嗎?您認為最後還有什麼要強調的?

JEFFREY RICHTER:我認為,這些開發人員即將面臨的一個最大問題就是,他們必須認識到是C#語言揭示了runtime和基底類別庫中的效能,或許假以時日他們會從經驗中學到。而許多人將會關注C#,也可能他們會試一試,或關注其它的.NET語言,也有可能會企圖做一些不被這些語言所支援的事,接著當然認為這是不可能的。例如:在C#中,所有的數組預設都是基於0的,是以0索引(下標)開始的。但是公用語言運行庫支援數組有任何的下邊界和上邊界。在基底類別庫中構造了一個數組,它具有所設定的上下邊界。但是C#自然不提供這些功能。因此,您必須去學習,隨著時間的推移,就會瞭解它是什麼,很多時候您或許可以使用其它語言,或者去訪問語言的底層系統,語言是位於runtime頂端的,由於某些原因,設計者不讓我們去訪問底層系統。


ROBERT HESS:似乎就是這樣,通過理解runtime底層的所有效能,然後您就可以把這些效能映射(map)給您目前正在使用的任何語言,以便瞭解它們是否提供給您所需要的功能。例如,我寫網頁時總是用純粹的HTML編寫,因為我知道它的具體功能是什麼。但是假如我必須用FrontPage寫,我知道FrontPage有它自己的格式(mindset),關係到網頁的顯示,並且我知道它能給我提供什麼,不能提供什麼。偶爾我也不得不轉回純粹的HTML並按這種方式增加某些東西或其它工具,這似乎是同樣的事情。


JEFFREY RICHTER:有時在C#中也有這些功能,但卻以不同的名字出現,例如,在公式語言庫中,虛擬函數被稱為family 。於是要在C#中建立一個虛擬函數,就會用protected 限定。對,或不用protected,但是在C#中的protected是等價於公用語言運行庫中的family的。噢,搞混了。看看,連我自己也糊塗了。


ROBERT HESS:因此基本的思路聽起來好象就是要去理解您正在使用的工具,以及它們在.NET framework底層的運行情況。好了,非常感謝Jeffery,又與您交談我感到非常榮幸,以後我會找一個時間再次邀請您回來參加這個“show”節目的。


JEFFREY RICHTER:好,我很樂意,謝謝。


ROBERT HESS:這就是程式員Jeffery對C#和.NET framework的看法。他提供給你們一些好資料,以讓你們瞭解更新的開發領域。他講到了很多的URL地址和原始碼例子以及類似的資料。我保證把它們放在本記錄稿的後面,所以請繼續觀看其餘的“show”節目,看看還有什麼內容。
……(略去與C#無關的談話)




結束語


ROBERT HESS:謝謝您參加另一期的MSDN Show。這一次我們討論了用C#編程的問題。

ERICA WIECHERS:在下一期的MSDN Show節目裡,我們將談論SOAP以及它是如何被整合到.NET編程體系的。

ROBERT HESS: 到那時,我們再在網上見面。


更多資料的連結

Microsoft C#資料:
C#綜述和介紹(Overview and Introduction to C#,http://msdn.microsoft.com/vstudio/nextgen/technology/csharpintro.asp)

C#語言規範(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)
    一個週期性專欄,在這裡Bobby Schmidt分享他使用C#的觀點和見識。

MSDN .NET開發人員中心(MSDN Developer Center for .NET,http://msdn.microsoft.com/net/)
     提供更多有關.NET技術的開發資料。

C#新聞群組(C# Newsgroup,news://msnews.microsoft.com/microsoft.public.dotnet.languages.csharp)
與正在學習使用C#的人互相討論、互相請教。

有關Jeffrey Richter談話的資料:
代碼範例(Sample Code:地址不詳)
書: Programming Applications for Microsoft Windows
     Programming Server-Side Applications for Windows
(和Jason Clark合寫)
Wintellect(http://www.wintellect.com/,)
Jeffrey 的培訓和諮詢公司。
TerraServer.NET(http://terraserver.microsoft.net/)
Jeffrey協助編寫的mapping服務。
Jeffrey Richter的首頁(http://www.jeffreyrichter.com/)

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。