導航:首頁 > 源碼編譯 > 條件編譯跨端兼容

條件編譯跨端兼容

發布時間:2022-05-15 13:44:48

⑴ coldblock寫c語言可以寫圖形用戶界面嗎

Code::Blocks 只是一個集成開發環境。至於能做什麼需要庫的支持,比如 GUI 庫:

8 個免費實用的 C++ GUI 庫推薦

GUI(Graphical User Interface,圖形用戶界面)是指採用圖形方式顯示的計算機操作用戶界面。與早期計算機使用的命令行界面相比,圖形界面對於用戶來說在視覺上更易於接受。

本文整理了8個免費、實用的C++ GUI庫,這些庫可以幫助你在下一個項目中創建具有吸引力的、令人印象深刻的程序界面。

1. Qt

Qt是一個跨平台應用和用戶界面開發框架,它包括一個跨平台類庫、集成開發工具和跨平台IDE。通過使用Qt,你可以一次性開發應用程序和用戶界面,然後將其部署到多個桌面和嵌入式操作系統,而無需重復編寫源代碼。

8. Zoolib

ZooLib允許你使用單一代碼庫,來創建可運行於多個平台/處理器上的應用程序,部分應用可能需要很少的平台專屬源碼。ZooLib非常簡單易用,你可以通過條件編譯來輕松集成它。

Code::Blocks 是一個免費、開源、跨平台的集成開發環境,使用C++開發,並且使用wxWidgets做為GUI函式庫。Code::Blocks使用了外掛程式架構,其功能可以使用外掛程式自由地擴充。目前, Code::Blocks主要針對開發C/C++程式而設計。

Code::Blocks目前支援Windows、Linux及Mac OS X數種平台。使用者亦能夠在FreeBSD環境中架設Code::Blocks[1].

⑵ 31、c++條件編譯的作用是根據不同條件進行編譯不同程序段,以提高程序的兼容性( × ) 為什麼不對

可能應該是編譯不同的代碼段,以提高代碼的兼容性。

⑶ 條件編譯問題

if語句是確定要編譯的內容,在運行時判斷,比如:
if(a>b)
printf("A大於B");
else
printf("A小於B");

條件編譯可不是在運行階段執行的,是為了某種需要(特別是跨平台的需要),只在編譯器掃描源代碼時,確定用哪一部分。

舉個例子,比如,一般LINUX多線程程序叫做pthread_create,而WINDOWS啟動多線程的程序是CreateThread,為了保證同一個程序可以跨平台運行,我們這樣書寫程序:
#ifdef WIN32 //如果是WINDOWS系統
#include <windows.h>
#define THREAD CreateThread
#else //如果是LINUX系統
#include <pthread.h>
#define THREAD pthread_create
#endif

⑷ 如何將Windows Phone應用移植到Windows 8平台

相對而言,使用 C++、C# 或 Visual Basic將 Microsoft Silverlight 應用從 Windows Phone 移植至 Metro風格應用是非常容易的。大部分的工作內容,所需的知識以及體驗,將轉向使用 XAML 的 Metro風格應用的模型,許多 XAML 界面設計與布局也是如此。
應用移植工作主要包含兩部分:
◆修改 UI,利用Windows Metro 風格 UI 的功能與設計指南;
◆從代碼隱藏文件中調用的Silverlight API 轉向相應的 Windows Runtime API。
很多情況下,代碼保持不變,或幾乎不變。雖然存在一些差別,但 Windows Runtime 中基於 XAML 的 UP API 是在 Windows Phone 版本的 Silverlight 上進行建模。另外,可使用 Metro 風格的 .NET API,這是完整的 .NET Framework 的子集,與.NET Framework for Silverlight 類似。在某些情況下,類似的.NET API已轉移到Windows Runtime,只是設計有稍許不同。
成功移植應用所需的工作量主要取決於:應用是否使用了大量 API,而這些 API 並未包含在 Metro 風格應用的 Windows Runtime 和 .NET API。本文提供了一些常規的移植指南與資源,用於定位 API 並確定多少代碼必須進行替換。
本文主要關注的是 Windows Phone 應用的移植,不過,對於任何 .NET 和基於XAML 的項目,可在以下主題中找到有用的相關信息:
將Silverlight 或 WPF XAML/代碼移植到Metro風格應用
Metro風格應用.NET概述
Windows Phone 7應用移植准備工作
在進行 Windows Phone 7 應用移植之前,請考慮以下相關事項:
◆是否需要對應用進行快速移植或獲得更佳的可維護性?「提高可維護性」部分提供了一些技巧,可用於對項目進行單源處理,並且有助於針對不同平台的項目間代碼再利用。
◆Windows Phone 7 設備解析度在水平模式在為水平模式下為800x480 (WVGA),垂直模式下為480x800。Windows 8 Release Preview 設備可具有多種長寬比,多種可能的水平與垂直解析度。界面與資產如何進行擴展?相關信息。
◆Windows Phone 7 界面為觸摸式的。Windows 8 界面也應支持觸摸,同時還需支持其他輸入方式,如滑鼠和鍵盤。對於某些未使用觸摸的用戶,你的界面是否感覺很笨拙?無論何種輸入方式,如何保持應用的可用性?相關信息,請參閱「可訪問性計劃」。
◆Windows Phone 7 應用中是否具有手機專業的功能?想法了解Windows Runtime 中相對應的網路技術?如果對手機或提供商提供更多功能支持,那麼可能需對其進行重新開發,提供更多的網路或提供商獨立性。
◆游戲應用是否依賴用於圖形渲染的 Microsoft XNA 組件?如果是,對於 Windows 8 應用無法使用 XNA。另外,對於託管代碼,無法有效地使用 DirectX;如果未使用第三發託管 API,那麼必須使用 C++ 進行 DirectX 游戲開發。有關更多信息,請參閱「創建DirectX游戲」。
常規移植過程
如果為了優化上市時間,需快速移植應用,請遵循以下步驟:
1.打開 Microsoft Visual Studio Express 2012 RC for Windows 8,使用C++、C# 或 Visual Basic 新建 Metro 風格應用。選擇應用布局與功能最為匹配的項目模板。有關更多信息,請參閱「使用模板(C++、C#、Visual Basic)快速創建 Metro 風格應用」。
2.復制想要在新項目中再利用的文件夾、代碼與資產文件。
3.在 Visual Studio 的「解決方案瀏覽器」(Solution Explorer),單擊「顯示所有文件」(Show All Files)。
4.選擇已復制的文件與文件夾,然後右鍵單擊並選擇「包含在項目中」(Include In Project)。
5.執行全局搜索與替換,將「System.Windows」替換為「Windows.UI.Xaml」。
6.將原始 XAML 代碼中可重用部分復制到新項目的 XAML 文件,或新建的 XAML 文件(如需要)。通常,頁面布局根(典型的示例:Grid 元素)可進行復制並重用,而最外層元素(如 PhoneApplicationPage 元素)並非如此。
7.構建項目,生成錯誤,然後這些錯誤找到需進行更新或替換的代碼。有時,所需的這種更新非常少,只是對參數類型進行更改。但有些更新需要使用 Metro style 所用的 Windows Runtime API 替代 .NET API。為了確認支持哪些 API,可使用本文與「Metro 風格應用 .NET 概述」以及「將 Silverlight 或 WPF XAML/代碼移植到 Metro 風格應用」,獲取相關指南。
8.對於任何無法輕易進行更新的代碼,請進行評注或清除,直到項目構建。
9.一次對評注代碼的一個問題進行更新或替換,直到移植完成。
提高可維護性
為了多個平台上的應用維護變得更加容易,請考慮使用以下技巧:
◆在移植之前,請對代碼進行重構,使其盡可能可重用。尤其,通過應用設計模式,如將業務邏輯與 UI 邏輯分開的Model-View-ViewModel (MVVM),可避免 UI API 差異方面的問題。使用 MVVM,模型與視圖模型代碼在不同平台上可保持大部分不變,同時視圖代碼(XAML)可根據平台定製。
◆在項目之間共享可重用代碼文件,而不是維護針對不同平台的多個副本。如需在 Visual Studio 中進行此類操作,請「解決方案瀏覽器」(Solution Explorer)中右鍵單擊該項目,選擇「添加已有項」(Add Existing Item),選擇共享文件,然後單擊「添加為鏈接」(Add As Link)。
◆如需在共享文件中包含某些平台專用代碼,請使用條件編譯。這種方式僅適用於 C#、C++ 和 Visual Basic 代碼。對於 XAML,必須對分開的代碼文件進行分別維護。
◆使用 Portable Class Library 創建跨平台的庫程序集。該可移植類庫包含 .NET Framework for Silverlight、Metro 風格應用 .NET API 和完整的 .NET Framework 中可用 .NET API 的子集。可移植類庫是與全部三個平台兼容的二進制文件,因此對於代碼重用是最為簡單的方式。不過,為了創建針對可移植類庫的項目,必須使用 Microsoft Visual Studio Professional 2012 RC 或更高版本。
移植用戶界面
Silverlight 的大多數布局類型,如Canvas、Grid和StackPanel,在 Windows Runtime XAML 命名空間里也會出現。雖然為了適應多種高於 800x480 的解析度,Grid 和布局設置需要進行調整,但基本用戶界面結構的移植應是直接式的。
當然,手機 UI 可能專門為小屏幕手機而設計。簡單地對其繼續擴展並非最佳設計,應根據 Metro 風格應用的功能以及 Windows 8 設備的多種形狀因素對 UI 進行重構。這種功能之一為分屏視圖(snapped view),對此手機 UI 設計可能是有用的。
更多信息與設計指南,請參閱以下主題:
◆製作優秀的 Metro 風格應用
◆多種形狀因素計劃
◆支持多種視圖
◆用戶體驗設計
◆用戶界面指南
◆使用設計清單
對定義應用布局的 XAML 文件進行調整之後,需要更新隱藏代碼,以使用 Windows Runtime API 替代 Silverlight API。對於用戶界面元素,在兩個 API 庫之間存在相當一致的映射。
使用 XAML 的Silverlight 與 Metro 應用之間的不同
雖然對於 Windows Phone 7 和 Windows 8,Metro 風格 UI 是相同的,但在兩個平台的 UI 的功能之間還存在一些差異。以下部分對其中一些關鍵的不同進行了描述。不過,為了確定具體支持哪些功能,應查詢 API 引用。更多關於使用 XAML 的 Metro 風格應用信息,請參閱「採用 C# 或 Visual Basic 的 Metro 風格應用的路線圖」。
控制項與布局
Windows Runtime 中的 XAML 控制項是基於 Silverlight 控制項的,但可能存在一些差異或缺少某些功能。例如:
Windows Runtime 未包含 Silverlight for Windows Phone 中提供的 Pivot 和 Panorama 控制項。這些控制項專門為手機形狀因素而設計,有助於提升比手機屏更大屏幕上的用戶體驗。Metro 風格應用通常具有更大的屏幕空間,並且應利用具有更大靈活性的 Grid 控制項的優勢。另外,還可以使用 FlipView 控制項來提供簡潔的翻頁體驗。
Windows Runtime 中的 AppBar 控制項提供的體驗與手機 ApplicationBar 類似,不過具有更多的靈活性,支持定製布局與數據綁定。
Windows Phone 可聲明支持何種設備旋轉方式,因此能夠對必需的布局靈活性進行限制。對於 Metro 風格應用,UI 設計應不受設備選擇方式與屏幕尺寸的限制。
更多關於控制項的信息,請參閱「功能控制項」。
磁貼與通知
Metro 風格應用的磁貼與 Windows Phone 7 的動態磁貼(Live Tile)類似,不過還存在一些差異。更多有關使用 C++、C# 或 Visual Basic 的 Metro 風格應用中的磁貼使用,請參閱創建磁貼。
通知是 Windows Phone 7 中推送通知模型的擴展。更多 Metro 風格應用中通知使用的詳細信息,請參閱發送消息條通知。
在使用C++、C# 或 Visual Basic 的 Metro 風格應用中使用磁貼、消息條和通知的更多信息與教程,請參閱使用磁貼、徽章和消息條通知。
數據應用場景
Metro 風格應用目前不包含對數據密集型應用場景(如業務線)的內置支持。例如,沒有用於客戶端 SQL 的 API 並且沒有本地資料庫。但是,利用定製服務與 OData 調用,仍然可從網路對數據進行檢索,並且利用客戶端 LINQ 可對數據進行形狀與格式化處理,同時可利用基於 XAML 控制項可進行綁定。
數據綁定大部分保持不變。例如,可部署 INotifyPropertyChanged 和 INotifyCollection,可相應地接收更改通知與更新 UI。但是,Metro 風格應用的數據相關功能當前還存在以下限制:
◆對數據項驗證和 IDataErrorInfo 和 INotifyDataErrorInfo 介面,未提供內置支持。
◆Binding 類未包含 Silverlight 中可用的擴展格式化屬性。但是,仍可部署 IValueConverter 已提供定製格式化。
◆IValueConverter 方法將語言字元串作為參數而不是 CultureInfo 對象。
◆CollectionViewSource 類未對於工作的排序、過濾和分組分別提供內置支持。更多信息,請參閱「使用 XAML 進行數據綁定」和「數據綁定示例」。
導航
為了與平台進行集成以及利用硬體「後退」按鍵,Silverlight for Windows Phone 應用需要使用基於頁面的導航結構。對於 Metro 風格應用,提供了類似的導航架構,但是由於平台的要求不同,存在一些差異:
◆在 Metro 風格應用中導航至某個頁面時,並未使用 URI 定址方案,而是指定目標頁面的類型,在該頁面 XAML 定義的x:Class屬性中顯示。另外,還可以選擇性地傳遞參數對象。
◆Metro 風格應用的導航框架不支持框架導航、日記(Back 堆棧)修訂和 URI 映射。
更多信息,請參閱快速入門:頁面間導航。

⑸ 通過條件編譯使得 字元串轉換大小寫,可以通過程序中動態的判斷執行嗎。

/*
宏預處理解決不了你的問題,請參考如下程序:
*/

#include <stdio.h>

int main(int argc, char* argv[])
{
char str[20] = "C Language";
char c;
int i = 0;
int convert_type = 1; /*1表示轉大寫,2表示轉小寫. 默認轉大寫*/

if ( argc > 1 )
{
if ( strcmp(argv[1], "2") == 0 )
{
convert_type = 2; /*轉小寫*/
}
}

while((c=str[i])!='\0')
{
i++;
if ( convert_type == 1 )
{
if( c >= 'a' && c <= 'z' )
{
c = c - 32;
}
}
else
{
if( c >= 'A' && c <= 'Z' )
{
c = c + 32;
}
}

printf("%c", c);
}

return 0;
}

/*
使用示例:
假設exe文件名稱為test.exe,如下運行

轉大寫:
test.exe
test.exe 1
轉小寫:
test.exe 2
*/

⑹ uniapp多久能上手

主要看個人學習能力和學習時間決定
uni-app 是一個使用 Vue.js 開發跨平台應用的前端框架。開發者通過編寫 Vue.js 代碼,uni-app 將其編譯到iOS、Android、微信小程序等多個平台,保證其正確運行並達到優秀體驗。uni-app 繼承自 Vue.js,提供了完整的 Vue.js 開發體驗。uni-app 組件規范和擴展api與微信小程序基本相同。有一定 Vue.js 和微信小程序開發經驗的開發者可快速上手 uni-app ,開發出兼容多端的應用。uni-app提供了條件編譯優化,可以優雅的為某平台寫個性化代碼、調用專有能力而不影響其他平台。

⑺ uniapp面試題必問有哪些

ni-app面試考試有幾個題是必問的:uni-app收費嗎?跨端會造成功能受限制嗎?以及uni-app的手機端用戶體驗如何?

1、uni-app收費嗎?

uni-app是免費產品,DCloud公司不會向開發者收取任何費用,大家可以放心使用。

DCloud提供的所有開發工具都是免費的,也不會有什麼陷阱。

DCloud的盈利點在幫助開發者進行推廣和流量變現上,而不在開發工具收費上。

2、跨端會造成功能受限制嗎?

uni-app在跨平台的過程中,不犧牲平台特色,不限制平台的能力使用。

應用開發中,80%的常規開發,比如界面組件、聯網等api,uni-app封裝為可跨多端的API。

其餘的,uni-app引入條件編譯。可以優雅的在一個項目里調用不同平台的特色能力。比如push,微信小程序里不支持,但可以在App里使用,還有很多原生sdk,在App時難免涉及,這些都可以正常的在uni-app框架下使用。

3、uni-app的手機端用戶體驗如何?

使用uni-app開發的微信小程序,和直接開發微信小程序相比性能沒有明顯差別,因為uni-app輸出到微信時也是編譯為wxml格式。uni-app編譯到微信使用的是mpvue框架,這個是業內廣泛使用的成熟框架。

uni-app打包成App後的體驗和微信小程序一樣好,在某些場景下更好;微信小程序的Hybrid應用框架是業內體驗上的標桿,實踐證明這種體驗足以承載一線互聯網開發商獲得上億用戶。

uni-app內置預載機制,載入新頁面速度極快,可實現無白屏極速渲染。

uni-app在App端還支持weex原生渲染(nvue),左右拖動長列表等復雜場景依然可實現高流暢性。

⑻ 誰給簡單介紹一下C#

C#(讀做 "C sharp",中文譯音「夏普」)是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網路框架的主角.

在本文中,我將考察創建一種新計算機語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用程序的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及Windows 2000的一個"d預覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型).

微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說structs),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:"這是對Java的反擊."

C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高.

Java所帶來的巨大影響和大家對它的廣泛接受已經由工作於這種語言和平台之上的程序員數量明顯的說明了(估計世界范圍內共有兩百五十萬程序員使用Java).由這種語言寫成的應用程序的數量是令人驚訝的並已經滲透了每一個級別的計算,包括無線計算和行動電話(比如日本發明的Java電話).C#能夠在用戶領域獲得這樣的禮遇嗎?我們必須等待並觀望,就象已經由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,"我發現所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術;它們在更大的意義上來說只是大公司製造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業有什麼影響."

C#從Java繼承而來的特點

類:在C#中類的申明與Java很相似.這是合理的因為經驗告訴我們Java模型工作得很好.Java的關鍵字import已經被替換成using,它起到了同樣的作用.一個類開始執行的起點是靜態方法Main().下面的Hello World程序展示了基本的形式:

using System;

class Hello
{

static void Main()
{

Console.WriteLine("Hello, world");

}

}

在這個例子中,System這個名字指向一個包括了基本C#實用類集合的命名空間(namespace).這個命名空間包括了Console類,它在這個例子中被用來輸出一個字元串.類可以是抽象的和不可繼承的:一個被申明成abstract的類不能被實例化;它只能被用做一個基類.C#關鍵字sealed就象Java關鍵字final,它申明一個類不是抽象的,但是它也不能被用做另一個類的基類.界面:就象在Java中一樣,一個界面是一組方法集合的抽象定義.當一個類或結構體實現一個界面的時候,它必須實現這個界面中定義的所有方法.一個單一的類可以實現幾個界面.也許以後會出現一些微妙的差別,但是這個特點看起來與Java相比沒有變化.布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其他類型沒有直接的轉換過程.布爾常量true和false是C#中的關鍵字.錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.內存管理:由底層.NET框架進行自動內存垃圾回收.

C#從C和C++繼承的特點

編譯:程序直接編譯成標準的二進制可執行形式.但C#的源程序並不是被編譯成二進制可執行形式,而是一中中間語言,類似於JAVA位元組碼。如果前面的Hello World程序被保存成一個文本文件並被命名為Hello.cs,它將被編譯成命名Hello.exe的可執行程序.

結構體:一個C#的結構體與C++的結構體是相似的,因為它能夠包含數據聲明和方法.但是,不象C++,C#結構體與類是不同的而且不支持繼承.但是,與Java相同的是,一個結構體可以實現界面.

預編譯:C#中存在預編譯指令支持條件編譯,警告,錯誤報告和編譯行控制.可用的預編譯指令有:

#define

#undef

#if

#elif

#else

#endif

#warning

#error

#line []

沒有了#include 偽指令.你無法再用#define 語句對符號賦值,所以就不存在源代碼替換的概念--這些符號只能用在#if和#elif偽指令里.在#line偽指令里的數字(和可選的名字)能夠修改行號還有#warning和#error輸出結果的文件名.

操作符重載:一些操作符能夠被重載,而另一些則不能.特別的是,沒有一個賦值運算符能夠被重載.能夠被被重載的單目操作符是:

+ - ! ~ ++ -- true false

能夠被重載的二元運算符是:

+ - * / % & | ^ << >> == != > < >= <=

C#獨有的特點

C#最引人入勝的地方是它和Java的不同,而不是相似的地方.這一節(和這個系列第二部分的大部分地方)講述了C#實現的和Java不同的地方或者Java根本沒有的特點.

中間代碼:微軟在用戶選擇何時MSIL應該編譯成機器碼的時候是留了很大的餘地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--如果不是大多數的話--程序員認為Java程序要不可避免的比C編寫的任何東西都要慢.而這種實現方式決定了基於MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一個符合CLS的版本--等語言編寫的程序)將在性能上超過"解釋性的"Java代碼.當然,這一點還需要得到事實證明,因為C#和其他生成MSIL的編譯器還沒有發布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對相同.象"C#是編譯語言而Java是解釋性的,"之類的聲明只是商業技巧.Java的中間代碼和MSIL都是中間的匯編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.

命名空間中的申明:當你創建一個程序的時候,你在一個命名空間里創建了一個或多個類.同在這個命名空間里(在類的外面)你還有可能聲明界面,枚舉類型和結構體.必須使用using關鍵字來引用其他命名空間的內容.

基本的數據類型:C#擁有比C,C++或者Java更廣泛的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類型都有一個固定的大小.又象C和C++一樣,每個數據類型都有有符號和無符號兩種類型.與Java相同的是,一個字元變數包含的是一個16位的Unicode字元.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放28位10進制數字.

兩個基本類:一個名叫object的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程序中寫入一句帶引號的字元串,編譯器會創建一個string對象來保存它.

參數傳遞:方法可以被聲明接受可變數目的參數.預設的參數傳遞方法是對基本數據類型進行值傳遞.ref關鍵字可以用來強迫一個變數通過引用傳遞,這使得一個變數可以接受一個返回值.out關鍵字也能聲明引用傳遞過程,與ref不同的地方是,它指明這個參數並不需要初始值.

與COM的集成:C#對Windows程序最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術.實際上,最終有可能在任何.NET語言里編寫COM客戶和伺服器端.C#編寫的類可以子類化一個以存在的COM組件;生成的類也能被作為一個COM組件使用,然後又能使用,比方說,JScript語言子類化它從而得到第三個COM組件.這種現象的結果是導致了一個運行環境的產生,在這個環境里的組件是網路服務,可用用任何.NET語言子類化.

索引下標:一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括弧中的數字來匿名引用(就象用數組下標一樣)以外是相似的.

public class ListBox: Control
{
private string[] items;

public string this[int index]
{
get
{
return items[index];
}
set
{
items[index] = value;
Repaint();
}
}
}

可以用一個循環器來匿名引用字元串內部數組成員,就象下面這樣:

ListBox listBox = ...;

listBox[0] = "hello";

Console.WriteLine(listBox[0]);

代理和反饋:一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當成一個聰明的方法指針就行了.代理對象可以被移動到另一個地方,然後可以通過訪問它來對已存在的方法進行類型安全的調用.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理調用的方法聲明.
補充:
C#簡史——摘自《程序員》雜志2005-12月刊
C# 簡史
編者按:時間過得真快,居然現在就可以寫C#的簡史了。但是想想也不奇怪,C#可謂
起點高、發展快的新一代語言,它的這五年走過了很多前輩十幾年的路。公允地說,C#是目
前兼顧系統開發和應用開發的最佳實用語言,並且很有可能成為編程語言歷史上的第一個「全
能」型語言。看過這篇簡史,我們都應該明白,不要再把C#看成年輕後生了——只要是「馬
拉多納」,就早晚當「球王」。
C# 1.0,純粹的面向對象
當時間回溯到1998年底,微軟正在忙於新一代COM的設計工作。此前,COM一直是組件化開發中非常成功的一種技術;但由於它僅提供了二進制
層面上的統一,因此無法將類型信息和用於支持基礎平台和開發工具的信息放到組件中。這時,Java正在逐步走向成熟。於是,微軟學習Java
的做法,將虛擬機的概念引入到了COM領域;同時,微軟提出了「元數據」的概念,用於描述組件的類型信息和工具支持信息,並決定將其放入
到組件當中。這種「COM虛擬機」的名字在經歷了若干爭論後,最終被定為CLR(Common Language Runtime,公共語言運行時)。與此同時,微
軟提出了在該運行時上運作的語言應該遵循的一些規則,以及該虛擬機的類型系統和指令集——所有這些規范形成了最終的C L I(Common
Language Infrastructure,公共語言基礎設施),並提交給了ECMA委員會。同時,微軟開發了CLI的一個實現,這就是大名鼎鼎的.NET了。
1998年12月,微軟啟動了一個全新的語言項目——COOL,這是一款專門為CLR設計的純面向對象的語言,也正是本文的主角——C#的前身。歷時
半年有餘,1999年7月份,微軟完成了COOL語言的一個內部版本。直到2000年2月份,微軟才正式將COOL語言更名為C#。據說起這個名字是因為
C#開發小組的人很討厭搜索引擎,因此把大部分搜索引擎無法識別的「#」 字元作為該語言名字的一部分;還有一種說法是在音樂當中「#」是
升調記號,表達了微軟希望它在C的基礎上更上一層樓的美好願望——當然這些都只是傳說,無從考證。又是歷經了一系列的修改,微軟終於在
2000年7月發布了C#語言的第一個預覽版。因此人們一般認為C#是2000年發布的,並以此來計算它的「年齡」。在此後的一年多時間里,微軟一
直在修補各個測試版本中的BUG。直到2002年2月,微軟終於推出了遲遲未上市的Visual Studio 7.0,並將其定名為「VisualStudio .NET 2002
」。隨著這套開發環境的出爐,開發者們終於看到了C#語言的第一個正式版本——C# 1.0。此後,微軟馬不停蹄,Visual Studio也恢復了往日
的開發進度。在2003年5月,微軟如期推出了Visual Studio .NET 2003,同時也發布了C#的改進版本——C# 1.1。這一時期的C#(以下稱為C#
1.x)提出了純粹的面向對象概念,並在語言特性中展現得淋漓盡致。C++並非純面向對象的,為了和C兼容以及提供更高的執行效率,它保留了
很多模塊化的東西。Java盡管號稱是面向對象的,但實際上,對於對象所應該具備的三種構成結構——屬性、方法和事件,Java僅提供了方法
,其它兩種結構都要通過方法來模擬。在C# 1.x中,所有面向對象的概念都在語言中得到了非常好的體現。同時,C#還通過類類型、值類型和
介面類型的概念形成了統一的類型系統。C#使用了大家所熟知的語法實現了方法,以至於很多人認為C#和Java、C++等面向對象語言「非常相像
」,這使得從使用其他面向對象語言轉到使用C#的過程非常簡單。此外,C#還通過無參數列表的方法聲名語法,結合get/set訪問器實現了優雅
的屬性語法。其中的get訪問器相當於獲取屬性值的方法,可以通過一些運算返回最終的結果,而不是簡單地返回一個變數的值;而set訪問器
相當於設置屬性值的方法,在其中可以進行一系列檢測,最後將屬性值賦給相應的變數。同時,通過同時提供get和set訪問器、只提供get訪問
器和只提供set訪問器,還可以很方便地實現可讀寫、只讀和只寫的屬性。C#的這種屬性語法,使得一個屬性在提供該屬性的類的內部看來,非
常像一組方法;而對於外部調用類看來,訪問一個對象的屬性和訪問它的公共域沒有任何區別。
通過委託(稍後介紹),結合關鍵字event,C#提供了優雅的事件概念。使用+=運算符,開發者可以非常方便地將一個事件處理器關聯到一個事
件上,這個過程稱之為「訂閱」一個事件。由於委託內部封裝了一個調用鏈表,因此可以方便地為一個事件添加多個事件處理器,這些處理器
會自動地依次調用。多年的開發語言進化證明,函數指針是非常重要也是非常危險的語言特徵之一。同時,基於函數指針的回調機制也Windows
核心概念之一。然而,由於函數指針很難驗證參數的類型准確性,因此C#(確切地說是CLI)提出了「委託」的概念,這是一種類型安全的函數
指針鏈表。這意味著,C#不僅可以提供回調機制,同時調用回調的一方還無需在其內部維護函數指針列表,所要做的僅僅是聲名一個具有恰當
委託類型的公共成員即可;而提供回調的一方也只需通過構造一個帶有指定方法的相應委託實例,並通過「+=」運算符添加到回調列表即可。
盡管C# 1.x提供了如此多的新鮮概念,但實際上,這些概念都是由CLI提出的。因此當將一個C#源程序編譯為可執行文件時,編譯器做的工作相
對而言並不多。需要編譯器代勞的是要將一個簡單的委託定義語句翻譯為一個繼承自System.MulticastDelegate類型定義。
C# 2.0,泛型編程新概念
微軟本打算繼續保證開發進度,並在2004年推出Visual Studio .NET 2004,但由於其間軟體工程學尤其是軟體管理學的大規模進步,微軟所提
供的這種僅具備開發和調試功能的IDE已經無法滿足團隊開發的需求。因此微軟決定在項目設計和管理工具方面進行了進一步研發,並將其集成
到Visual Studio中,以贏回原有的市場。因此,微軟將Visual Studio.NET 2004「改名」為Visual Studio 2005,並決定推遲一年發布。不過
,微軟還是堅持在2004年的6月份發布了Visual Studio2005的第一個Beta 版,同時向開發者展示了C#語言的2.0版本。2005年4月,微軟發布了
Visual Studio 2005 Beta2,這已經是具備了幾乎全部功能的VisualStudio,包括的產品有SQL Server2005、Team Foundation Server和
TeamSuite。這時的C#編譯器已經能夠處理C# 2.0中所有的新特性。C# 2.0為開發者帶來的最主要的特性就是泛型編程能力。和面向對象思想一
樣,泛型思想也是一種已經成熟的編程思想,但依然是沒有哪一種主流開發語言能夠支持完備的泛型概念。這主要是因為泛型的概念在一定程
度上對面向對象概念進行沖擊,同時,由於在編譯期間對類型參數的完全檢測很難做到,很多問題會被遺留到運行時。C# 2.0別出心裁,對泛
型類型參數提出了「約束」的新概念,並以優雅的語法體現在語言之中。有了約束,結合編譯器強大的類型推斷能力,可以在編譯時
發現幾乎所有「危險」的泛型應用。C# 2.0的另一個突出的特性就是匿名方法,用來取代一些短小的並且僅出現一次的委託,使得語言結構更
加緊湊。匿名方法除了可以使得事件處理器的編寫更加精簡以外,還將開發者帶入了程序設計的一個新的領域——函數式編程,曾經有高人就
用匿名方法結合泛型編程實現了函數式編程中的重要結構—— Lambda 表達式。盡管這種實現顯得很繁瑣而且不易理解,但畢竟是實現了。最
終,函數式編程還是被引入到了C#語言中,這將在下一節中為大家講述。
此外,C# 2.0還進一步增強了語言的表達能力。在C# 2.0中,屬性語法中的get和set訪問器可以擁有不同的許可權,這就使得定義一個在庫的內
部可讀寫,而在庫的外部只讀的屬性成為可能。同時,C# 2.0還提供了迭代器的概念,這使得一個類無需實現IEnumerator 和IEnumerable介面
即可實現一個可以進行遍歷的類型,並且無需在類型中維護迭代狀態。此時的.NET已經得到了很廣泛的認可,並且因為元數據為組件帶來了強
大的自我描述能力,許多程序庫廠商被吸引到.NET平台上來。隨著.NET程序庫數量的增長,逐漸暴露了命名的問題。在面向對象技術廣泛發展
後,人們就意識到名字的管理問題,因此幾乎所有的面向對象語言都提出了「命名空間」的概念;
而在C# 1.x時代,這個問題再一次出現。如果一個庫廠商XX 希望以XX.System來命名他們自己的系統基礎庫,那麼當開發者使用using System
語句時就會產生歧義。為此。C# 2.0中提供了global關鍵字,這為.NET庫中所有的命名空間提供了一個「根」,通過指定global::System和
global::XX.System就可以區別兩個庫了。這一時期的C#編譯器變得非常復雜,泛型的引入使得編譯器不得不具備超強的類型推斷能力。同時,
迭代器的思想並非是在CLI層面上實現的,而是由編譯器自動生成了實現I E n u m e r a t o r 和IEnumerable介面類型。
C# 3.0,魔鬼
在經歷了一系列的改進和完善後,微軟決定於2005年11月發布Visual Studio2005,該開發環境將正式支持C#2.0。由於此前推出了數個預覽版
和測試版,大家的期待之情似乎已經不是那麼強烈了。而2005年9 月份的PDC大會則為開發者們帶來了另外的驚喜——C#3.0(研發代號「Orcas
」——魔鬼)的技術預覽版。
說到C# 3.0,就不得不提一下微軟的LINQ 項目,LINQ(語言集成查詢,Language Integrated Query)提出了一種通過面向對象語法來實現對
非面向對象數據源的查詢技術,可查詢的數據源從關系型資料庫延伸到一般意義上的集合(如數組和列表)以及XML。而C# 3.0則是率先實現了
LINQ的語言。在C# 3.0中,我們可以用類似於SQL語句的語法從一個數據源中輕松地得到滿足一定條件的對象集合。例如要查找一個字元串
數組names中所有長度大於5的字元串,就可以寫: var longname = from n in names wheren.Length > 5 select n;這樣我們就得到一個
新的字元數組longname,其中包含了我們所需要的結果。這種語句稱作查詢語句,與SQL語句唯一的區別是C#中的查詢語句往往把select子句放
到最後(這反而倒有些類似於中文的閱讀順序了)。初次看到這樣一個語句,我們可能會有很大疑問:這還是C#語言嗎?這的確是合乎語法規
則的C#代碼,而且編譯器可以識別這種語法。然而實際上,C#編譯器並不會對這種語法進行實際的的編譯,而是將其翻譯為正常的方法調用:
var longname = names.Where(n => n.
Length > 5).Select(n);然後再進行進一步的編譯。在上面的例子中已經說明,names是一個存放有字元串的數組,而數組類型並沒有Where的
方法。的確,Where並非names的成員方法,微軟也沒有對數組類型進行任何改動。這是C# 3.0中另外一個重要的新特性:擴展方法。擴展方法
是定義在其他靜態類中的靜態方法,其第一個參數的類型就是希望擴展的類型,並且這個參數被冠以this修飾符。擴展方法是靜態的,但可以
像調用被擴展類型的實例方法那樣進行調用,看起來好像是被擴展類型自己的方法一樣。這就為語言帶來了很大的靈活性,我們可以將一組近
似的功能如上面的Where 和Select等(這在LINQ中被稱作「標准查詢表達式」)定義在一個外部類中,這樣既無須修改現有類型,又可以將新
功能組織在一起。當然,為了做到面向對象的封裝性,擴展方法只能在被擴展類型的公共成員上進行操作,如果需要從內部對類型進行改進,
就必須改變現有類型的代碼。在Where方法的參數列表裡,我們又發現了一種奇怪的語法:n => n.Length > 5。這就是我們上文提到過的
Lambda 表達式。微軟的官方規范中稱,Lambda 表達式是匿名方法的一種自然進化。因此Lambda 表達式其實也是一種特殊的委託,由編譯器負
責生成一個匿名的委託類型,它接受一個字元串類型的參數n;返回值為布爾類型,表示n的長度是否大於5;其中的參數類型和返回值類型都是
由編譯器推斷而來的。說到類型推斷,還要解釋的一點就是上面的語句中出現的新關鍵字var。從出現的位置來看,var應該是一個類型。然而
這又不是一個C#內建類型,也不是CLI提出的新類型;它只是一個「佔位符」,它的確表示一個類型,但具體是什麼類型需要編譯器在編譯期間
進行推斷。Lamda表達式的真正意義不僅僅在於簡化了委託的編寫方式,更重要的是它把代碼表達式體現為了數據。換句話說,Lambda表達式不
僅可以被編譯為一段可以執行的代碼(類似於匿名方法),也可以將其翻譯為一個數據結構——表達式樹。而如何處理Lambda 表達式,是由編
譯器根據Lambda表達式的使用方式來自動確定的。當把一個Lambda表達式賦給一個具有委託類型的域、屬性或變數時,編譯器像編譯匿名方法
一樣將表達式體翻譯成一段可執行代碼;而當把一個L a m b d a 表達式賦給一個具有Expression<T>類型的域、屬性或變數時,編譯器就會將
Lambda表達式解析為一個表達式樹。對於翻譯為代碼的Lambda,可以向調用委託那樣進行調用,而對於翻譯為表達式樹的Lambda表達式,就不
可以了,會得到一個編譯錯誤。但表達式樹存在於一個由編譯器生成的數據結構中,因此可以在運行時對其進行分析甚至修改。
除了上面提到的一些重大改進之外,C# 3.0也對細微的語法進行了一些改進,使C#語言變得更加優雅和全面。值得說明的是,C# 3.0經過編譯
後生成的IL代碼,完全是基於.NET 2.0的,C#語言已經遠遠跑在了他所棲生的平台前面。這一時期的C#語言離CLI已經越來越遠了,編譯器的工
作也愈加繁重起來。首先很多語言結構(如查詢表達式和Lambda 表達式)都不是CLI中提供的特性,因此需要編譯器進行大量的轉譯工作;其
次是這些語言結構帶來的大量類型推斷任務,也都是靠編譯器來完成的。
C#走到了3.0以後,已經完全不再是當年那個「簡單」的語言了。它的開發者稱其為「魔鬼」,而琳琅滿目的新特性也的確讓開發者們眼花繚亂
,甚至感到恐懼。語言集成查詢的引入,使得前一段時期內為開發者們廣泛討論的ORM概念得到了更加深入地體現,尤其是它所支持的數據源之
廣泛,讓ORM理念變得已經不再必要了;而一些「.NET中的ORM實現」,似乎也成了完全不必要的擴展項目了。Lambda 表達式的引入,使得C#
將可以輕松地完成特定領域(Domain-Specific)的開發。一個成功的開發人員在面對新鮮事物和新的困難時,興奮是遠大於恐懼的。
讓魔鬼來得更猛烈些吧!

閱讀全文

與條件編譯跨端兼容相關的資料

熱點內容
ubuntu壓縮zip 瀏覽:2
vigenere演算法的方法是什麼 瀏覽:666
pdf保護破解 瀏覽:341
仿微信聊天系統源碼廣州公司 瀏覽:106
怎麼查看我的世界伺服器日誌 瀏覽:430
怎麼從程序員走到成功 瀏覽:824
把軟體放入文件夾中如何移出 瀏覽:209
紅包源碼企業即時聊天軟體 瀏覽:581
xp安裝python 瀏覽:10
西門子參數編程讀取半徑值 瀏覽:403
洗首飾解壓小視頻 瀏覽:966
01背包問題的演算法解決 瀏覽:373
sd卡放哪個文件夾 瀏覽:301
解釋器模式java 瀏覽:104
android垂直自動滾動條 瀏覽:153
計算器java小程序 瀏覽:27
java的簡稱 瀏覽:68
雲伺服器公網ip地址 瀏覽:581
php對資料庫操作 瀏覽:237
java爬圖片 瀏覽:868