若是你是 Java 開發人員,則能夠在 Xamarin 平臺上充分利用你的技能和現有代碼,同時得到 C# 的代碼重用優點。你會發現 C# 語法與 Java 語法很是類似,這兩種語言提供很是相似的功能。此外,你會發現 C# 的特有功能,這些功能將幫助你輕鬆進行開發工做。html
本文介紹面向 Java 開發人員的 C# 編程,主要側重於在開發 Xamarin.Android 應用程序時會遇到的 C# 語言功能。 此外,本文說明了這些功能與其 Java 對應項的區別所在,並介紹了在 Java 中不可用的重要 C# 功能(與 Xamarin.Android 相關)。 包含指向附加參考資料的連接,所以你能夠將本文用做一個「起點」以進一步研究 C# 和 .NET。java
若是你熟悉 Java,那麼對於 C# 語法的使用即可以輕鬆上手。 C# 語法與 Java 語法很是類似 – C# 是「大括號」語言,如 Java、C 和 C++。 在許多方面,C# 語法讀起來像是 Java 語法的超集,可是有一些重命名和新增的關鍵字。android
能夠在 C# 中找到 Java 的許多主要特徵:web
面向對象的基於類的編程數據庫
強類型化express
支持接口編程
泛型緩存
垃圾回收安全
運行時編譯服務器
Java 和 C# 都被編譯爲中間語言,在託管執行環境中運行。 C# 和 Java 都是靜態類型,這兩種語言將字符串視爲不可變類型。 這兩種語言使用單根類層次結構。 和 Java 同樣,C# 僅支持單一繼承,不支持全局方法。 在這兩種語言中,對象使用 new
關鍵字在堆上建立而成,當再也不使用對象時,它們會被做爲垃圾回收處理。 這兩種語言提供帶 try
/catch
語義的正式異常處理支持。 二者都提供線程管理和同步支持。
可是,Java 和 C# 之間存在不少不一樣。 例如:
Java 不支持隱式類型的局部變量(C# 支持 var
關鍵字)。
在 Java 中,能夠僅按值傳遞參數,而在 C# 中,你能夠按引用以及值進行傳遞。 (C# 提供 ref
和 out
關鍵字,用於按引用傳遞參數;Java 中無此類等效項)。
Java 不支持預處理器指令,如 #define
。
Java 不支持無符號整數類型,而 C# 提供無符號整數類型,如 ulong
、uint
、ushort
和 byte
。
Java 不支持運算符重載;在 C# 中,能夠重載運算符和轉換。
在 Java switch
語句中,代碼能夠貫穿到下一個 switch 部分,但在 C# 中,每一個 switch
部分的結尾必須終止 swith(每一個部分的結尾必須以 break
語句結束)。
在 Java 中,指定由帶 throws
關鍵字的方法引起的異常,但 C# 沒有檢查異常的概念 – throws
關鍵字在 C# 中不受支持。
C# 支持語言集成查詢 (LINQ),這樣就可使用保留的字 from
、select
和 where
,以便以相似於數據庫查詢的方式編寫針對集合的查詢。
固然,與本文所討論的相比,C# 和 Java 之間還有更多的區別。 此外,Java 和 C# 將繼續演進(例如,Android 工具鏈中尚不存在的 Java 8,它支持 C# 樣式的 lambda 表達式),所以這些差別會隨時間而變化。 本文僅概述了首次使用 Xamarin.Android 的 Java 開發人員當前遇到的最重要的差別。
從 Java 到 C# 開發介紹了 C# 和 Java 之間的基本區別。
面向對象的編程功能概述了兩種語言之間最重要的面向對象的功能區別。
關鍵字差別提供了一個表格,其中包含有效的關鍵字等效項、僅限 C# 的關鍵字以及指向 C# 關鍵字定義的連接。
C# 爲 Xamarin.Android 提供了許多主要功能,Java 開發人員當前尚不可在 Android 上使用這些功能。 這些功能可幫助你在更短的時間內編寫出更好的代碼:
屬性 – 可經過 C# 屬性系統直接安全地訪問成員變量,而無需編寫 setter 和 getter 方法。
Lambda 表達式 – 在 C# 中,你可使用匿名方法(也稱爲「lambda」 )更簡潔、更高效地表示你的功能。 你能夠避免編寫一次性對象的開銷,而且能夠向某個方法傳遞本地狀態而無需添加參數。
事件處理 – C# 爲事件驅動的編程 提供語言級別支持,對象能夠進行註冊,以便在出現感興趣的事件時接收通知。 event
關鍵字定義發佈服務器類可用於通知事件訂閱者的多播廣播機制。
異步編程 – C# 的異步編程功能 (async
/await
) 使應用保持響應狀態。 此功能的語言級別支持使異步編程輕鬆實現,且不容易出錯。
最後,Xamarin 容許你經過已知的綁定 技術來利用現有的 Java 資產。 你能夠經過使用 Xamarin 的自動綁定生成器,從 C# 調用現有的 Java 代碼、框架和庫。 若要執行此操做,只需在 Java 中建立靜態庫,並經過綁定將其公開到 C#。
如下各節概述了 C# 和 Java; 之間的基本「入門」差別;後面的部分將介紹這些語言之間面向對象的差別。
Java 一般將相關類打包到 .jar 文件中。 然而,在 C# 和 .NET 中,預編譯代碼的可重用位將打包到程序集 ,一般打包爲 .dll 文件。 程序集是部署 C#/.NET 代碼的單位,每一個程序集一般與 C# 項目相關聯。 程序集包含在運行時實時編譯的中間代碼 (IL)。
有關程序集的詳細信息,請參閱程序集和全局程序集緩存主題。
C# 使用 namespace
關鍵字對相關類型進行分組;這相似於 Java 的 package
關鍵字。 一般狀況下,Xamarin.Android 應用將駐留在爲該應用建立的命名空間中。 例如,下面的 C# 代碼聲明天氣報告應用的 WeatherApp
命名空間包裝器:
namespace WeatherApp { ...
在使用外部命名空間中定義的類型時,使用 using
語句導入這些類型(近似於 Java import
語句)。 在 Java 中,你可能使用如下語句導入單個類型:
import javax.swing.JButton
可能會使用相似於下面的語句導入整個 Java 包:
import javax.swing.*
C# using
語句的工做方式很是相似,但它容許導入整個包而無需指定通配符。 例如,在 Xamarin.Android 源文件的開頭,一般會看到一系列 using
語句,如如下示例所示:
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using System.Net; using System.IO; using System.Json; using System.Threading.Tasks;
這些語句從 System
、Android.App
、Android.Content
等命名空間導入功能。
Java 和 C# 支持泛型 ,這是容許你在編譯時插入不一樣類型中的佔位符。 可是,泛型在 C# 中的工做方式略有不一樣。 在 Java 中,類型擦除僅在編譯時提供類型信息,而不是在運行時。 與此相反,.NET 公共語言運行時 (CLR) 對泛型類型提供顯式支持,這意味着 C# 有權在運行時訪問類型信息。 在平常 Xamarin.Android 開發中,這一區別的重要性一般不明顯,但若是使用的是反射,你將依賴此功能在運行時訪問類型信息。
在 Xamarin.Android 中,一般會看到泛型方法 FindViewById
用於獲取對佈局控件的引用。 此方法接受一個泛型類型參數,指定要查找的控件類型。 例如:
TextView label = FindViewById<TextView> (Resource.Id.Label);
在此代碼示例中,FindViewById
將佈局中定義的 TextView
控件做爲標籤 引用,而後將其做爲 TextView
類型返回。
有關泛型的更多信息,請參閱泛型主題。 請注意,Xamarin.Android 對泛型 C# 類的支持存在一些限制;有關詳細信息,請參閱限制。
Java 和 C# 使用很是類似的面向對象的編程慣用語:
全部類最終都派生自單個根對象 – 全部 Java 對象均派生自 java.lang.Object
,而全部 C# 對象均派生自 System.Object
。
類實例爲引用類型。
訪問某個實例的屬性和方法時,可使用「.
」運算符。
全部類實例均經過 new
運算符在堆上建立。
因爲這兩種語言都使用垃圾回收,所以沒法顯式釋放未使用的對象(即,不像 C++ 同樣存在 delete
關鍵字)。
能夠經過繼承來擴展類,而且這兩種語言只容許每種類型有單個基類。
能夠定義接口,而且一個類能夠繼承自(即,實現)多個接口定義。
可是,也有一些重要的區別:
Java 有兩個 C# 不支持的強大功能:匿名類和內部類。 (可是,C# 容許嵌套類定義 – C# 的嵌套類就像 Java 的靜態嵌套類。)
C# 支持 C 樣式結構類型 (struct
),而 Java 不支持。
在 C# 中,能夠在單獨的源文件中經過使用 partial
關鍵字實現類定義。
C# 接口不能聲明字段。
C# 使用 C++ 樣式析構函數語法來表示終結器。 該語法不一樣於 Java 的 finalize
方法,但語義大體相同。 (請注意,在 C# 中,析構函數自動調用基類析構函數 –而在 Java 中則使用對 super.finalize
的顯式調用。)
要擴展 Java 中的類,可使用 extends
關鍵字。 要擴展 C# 中的類,可使用冒號 (:
) 以指示派生。 例如,在 Xamarin.Android 應用中,一般會看到相似於如下代碼段的類派生:
public class MainActivity : Activity { ...
在此示例中,MainActivity
繼承自 Activity
類。
要在 Java 中聲明對接口的支持,可使用 implements
關鍵字。 可是,在 C# 中,只需將接口名稱添加到從中繼承的類列表,如如下代碼段所示:
public class SensorsActivity : Activity, ISensorEventListener { ...
在此示例中,SensorsActivity
繼承自 Activity
,並實現 ISensorEventListener
接口中聲明的功能。 請注意,接口列表必須晚於基類(不然將收到一個編譯時錯誤)。 按照約定,C# 接口名稱前有一個大寫「I」;這樣便能肯定哪些類是接口,而無需 implements
關鍵字。
若是想要阻止類在 C# 中進一步子類化,請在類名前添加 sealed
– 在 Java 中,在類名前添加 final
。
在 Java 中,賦值函數方法 (setter) 和檢查器方法 (getter) 一般用於控制在隱藏和保護類成員不受外部代碼影響時如何對這些成員進行更改。 例如,Android TextView
類提供 getText
和 setText
方法。 C# 提供類似但更直接的機制,稱爲「屬性」 。 C# 類用戶可使用與訪問字段相同的方式來訪問屬性,可是每次訪問實際上會致使對調用方透明的方法調用。 此「隱祕」方法會致使一些反作用,如設置其餘值、執行轉換,或更改對象狀態。
屬性一般用於訪問和修改 UI(用戶界面)對象成員。 例如:
int width = rulerView.MeasuredWidth; int height = rulerView.MeasuredHeight; ... rulerView.DrawingCacheEnabled = true;
在此示例中,可經過訪問 rulerView
對象的 MeasuredWidth
和 MeasuredHeight
屬性從中讀取寬度和高度值。 在讀取這些屬性時,其關聯(但隱藏)字段值中的值會在後臺提取,並返回給調用方。 rulerView
對象能夠在一個度量單位(如像素)中存儲寬度和高度的值,並在訪問 MeasuredWidth
和 MeasuredHeight
屬性時將這些值實時轉換爲不一樣的度量單位(如毫米)。
rulerView
對象還有一個名爲 DrawingCacheEnabled
的屬性 – 示例代碼將此屬性設置爲 true
以啓用 rulerView
中的繪製緩存。 在後臺,關聯的隱藏字段已更新爲新值,rulerView
狀態的可能其餘方面已修改。 例如,當 DrawingCacheEnabled
設置爲 false
時,rulerView
還可能清除對象中累積的任何繪製緩存信息。
對屬性的訪問權限能夠是讀/寫、只讀或只寫。 此外,可使用不一樣的訪問修飾符進行讀取和寫入。 例如,能夠定義一個具備公共讀取訪問權限和專有寫入訪問權限的屬性。
有關 C# 屬性的詳細信息,請參閱屬性主題。
若要在 C# 中調用基類構造函數,可使用後跟關鍵字 base
的冒號 (:
) 和初始化表達式列表;此 base
構造函數調用會被當即置於派生的構造函數參數列表後。 在進入派生構造函數時,將調用基類構造函數;編譯器會在方法主體開頭將此調用插入到基構造函數。 下面的代碼段演示了從 Xamarin.Android 應用中的派生構造函數調用的基構造函數:
public class PictureLayout : ViewGroup { ... public PictureLayout (Context context) : base (context) { ... } ... }
在此示例中,PictureLayout
類派生自 ViewGroup
類。 此示例中所示的 PictureLayout
構造函數接受 context
參數,並經過 base(context)
調用將其傳遞給 ViewGroup
構造函數。
若要在 C# 中調用基類方法,請使用 base
關鍵字。 例如,Xamarin.Android 應用一般調用基方法,以下所示:
public class MainActivity : Activity { ... protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle);
在這種狀況下,由派生類 (MainActivity
) 定義的 OnCreate
方法調用基類 (Activity
) 的 OnCreate
方法。
Java 和 C# 都支持 public
、private
和 protected
訪問修飾符。 可是,C# 支持如下兩個其餘訪問修飾符:
internal
– 只能在當前程序集內訪問類成員 。
protected internal
– 可在定義程序集、定義類和派生類中訪問類成員(程序集內部和外部的派生類都具備訪問權限) 。
有關 C# 訪問修飾符的詳細信息,請參閱訪問修飾符主題。
Java 和 C# 均支持多形性 ,即可以以相同方式處理相關對象。 在這兩種語言中,可使用基類引用來引用派生類對象,且派生類的方法能夠重寫基類的方法。 兩種語言都具備虛擬 方法的概念,此基類方法旨在替換爲派生類中的方法。 和 Java 同樣,C# 支持 abstract
類和方法。
可是,Java 和 C# 之間在如何聲明和重寫虛擬方法方面存在一些差別:
默認狀況下,在 C# 中,方法是非虛擬的。 父類必須顯式標記要使用 virtual
關鍵字重寫的方法。 與此相反,Java 中的全部方法都默認爲虛擬方法。
要防止在 C# 中重寫方法,只需刪除 virtual
關鍵字。 與此相反,Java 使用 final
關鍵字將方法標記爲「不容許重寫」。
C# 派生類必須使用 override
關鍵字顯式指示正在重寫虛擬基類方法。
有關 C# 對多形性支持的詳細信息,請參閱多形性主題。
能夠經過 C# 建立一個閉包 :內聯匿名方法,能夠訪問它們包含在其中的方法的狀態。 使用 lambda 表達式,你能夠編寫較少的代碼行來實現相同功能,你可能已使用更多的代碼行在 Java 中實現該功能。
Lambda 表達式使你能夠跳過像在 Java 中建立一次性類或匿名類時會涉及到的其餘繁瑣操做 – 而只需編寫方法代碼內聯的業務邏輯便可。 此外,因爲 lambda 對周圍方法中的變量具有訪問權限,所以沒必要建立用於將狀態傳遞到方法代碼的長參數列表。
在 C# 中,lambda 表達式經過 =>
運算符建立而成,以下所示:
(arg1, arg2, ...) => {
// implementation code };
在 Xamarin.Android 中,lambda 表達式一般用於定義事件處理程序。 例如:
button.Click += (sender, args) => {
clickCount += 1; // access variable in surrounding code button.Text = string.Format ("Clicked {0} times.", clickCount); };
在此示例中,lambda 表達式代碼(在大括號內的代碼)遞增點擊數,並更新 button
文本以顯示點擊數。 此 lambda 表達式在 button
對象中註冊爲點擊按鈕時要調用的點擊事件處理程序。 (下文對事件處理程序進行了更詳細的說明。)在此簡單示例中,lambda 表達式代碼不使用 sender
和 args
參數,但 lambda 表達式須要這些參數來知足事件註冊的方法簽名要求。 實質上,C# 編譯器將 lambda 表達式轉換爲一個匿名方法,在發生按鈕點擊事件時會調用該方法。
有關 C# 和 lambda 表達式的詳細信息,請參閱Lambda 表達式主題。
事件 是在對象出現一些有趣的內容時,該對象通知註冊訂閱者所採用的一種方式。 與 Java 不一樣,訂閱者一般在 Java 中實現 Listener
接口,其中包含一個回調方法,而 C# 則經過委託 爲事件處理提供語言級別支持。 委託 相似於面向對象的類型安全函數指針 – 它封裝對象引用和方法令牌。 若是客戶端對象想要訂閱事件,它將建立委託並將該委託傳遞給通知對象。 發生事件時,通知對象將調用委託對象所表示的方法,以通知訂閱事件的客戶端對象。 在 C# 中,事件處理程序實際上就是經過委託調用的方法。
有關委託的詳細信息,請參閱委託主題。
在 C# 中,事件爲多播 ;也就是說,發生某事件時能夠通知多個偵聽器。 當你考慮 Java 和 C# 事件註冊之間的語法差別時,將觀察到這種差別。 在 Java 中,能夠調用 SetXXXListener
來註冊事件通知;在 C# 中,可使用 +=
運算符來註冊事件通知,方法是將委託「添加」到事件偵聽器列表。 在 Java 中,能夠調用 SetXXXListener
以取消註冊,而在 C# 中,則使用 -=
將委託從偵聽器列表中「去除」。
在 Xamarin.Android 中,事件一般用於在用戶對 UI 控件執行某操做時通知對象。 一般,UI 控件將具備使用 event
關鍵字定義的成員;將委託附加到這些成員,以便從該 UI 控件中訂閱事件。
訂閱事件:
建立一個委託對象,在事件發生時引用要調用的方法。
使用 +=
運算符將委託附加到你訂閱的事件。
下面的示例定義了一個委託(顯式使用 delegate
關鍵字)以訂閱按鈕點擊事件。 此按鈕點擊處理程序將啓動新的活動:
startActivityButton.Click += delegate { Intent intent = new Intent (this, typeof (MyActivity)); StartActivity (intent); };
可是,你還可使用 lambda 表達式來註冊事件,一塊兒跳過 delegate
關鍵字。 例如:
startActivityButton.Click += (sender, e) => {
Intent intent = new Intent (this, typeof (MyActivity)); StartActivity (intent); };
在此示例中,startActivityButton
對象具備一個事件,該事件指望帶有特定方法簽名的委託:該事件接受發件人和事件參數並返回 void。 可是,由於咱們不但願在顯式定義此類委託或其方法時遇到問題,咱們聲明具備 (sender, e)
的方法簽名並使用 lambda 表達式來實現事件處理程序的主體。 請注意,必須聲明此參數列表,即便不使用 sender
和 e
參數。
務必記住,你能夠取消訂閱委託(經過 -=
運算符),但不能取消訂閱 lambda 表達式 – 試圖執行此操做可能會致使內存泄漏。 只有當處理程序不從事件中取消訂閱時,才能使用 lambda 形式的事件註冊。
一般,lambda 表達式用於聲明 Xamarin.Android 代碼中的事件處理程序。 此用於聲明事件處理程序的速記方法乍一看可能比較晦澀,但在你寫入和讀取代碼時它將幫你節省大量的時間。 隨着熟悉程度的增長,你將習慣於識別此模式(這在 Xamarin.Android 代碼中常常出現),能夠花更多的時間思考應用程序的業務邏輯,而不須要花太多時間在語法開銷上。
異步編程 是改進應用程序整體響應能力的一種方法。 當應用程序的某些部分被冗長的操做所阻塞時,異步編程功能使應用代碼的其他部分得以繼續運行。 若是應用程序未以異步方式編寫,訪問 Web、處理圖像和讀取/寫入文件等操做示例可能會致使整個應用看上去像凍結了同樣。
C# 包含對經過 async
和 await
關鍵字進行異步編程的語言級別支持。 經過這些語言功能,能夠很是方便地編寫代碼來執行長時間運行的任務,而不會阻止應用的主線程。 簡而言之,能夠在某個方法上使用 async
關鍵字來指示方法中以異步方式運行,且不會阻止調用方線程的代碼。 在調用標記有 async
的方法時使用 await
關鍵字。 編譯器會將 await
解釋爲一個點,其中方法執行將移至後臺線程(會向調用方返回一個任務)。 完成此任務後,將在代碼中 await
點處的調用方線程上恢復代碼執行,從而返回 async
調用的結果。 按照約定,異步運行的方法的名稱帶有 Async
後綴。
在 Xamarin.Android 應用中,async
和 await
一般用於釋放 UI 線程,以便在後臺任務中發生長時間運行的操做時,它能夠響應用戶輸入(如點擊「取消」 按鈕)。
在如下示例中,按鈕點擊事件處理程序將致使異步操做從 Web 下載映像:
downloadButton.Click += downloadAsync;
...
async void downloadAsync(object sender, System.EventArgs e) { webClient = new WebClient (); var url = new Uri ("http://photojournal.jpl.nasa.gov/jpeg/PIA15416.jpg"); byte[] bytes = null; bytes = await webClient.DownloadDataTaskAsync(url); // display the downloaded image ...
在此示例中,當用戶單擊 downloadButton
控件時,downloadAsync
事件處理程序將建立 WebClient
對象和 Uri
對象,以便從指定 URL 中提取映像。 接下來,它使用此 URL 調用 WebClient
對象的 DownloadDataTaskAsync
方法來檢索映像。
請注意,downloadAsync
的方法聲明以 async
關鍵字開頭,指示它將以異步方式運行,並返回一個任務。 另請注意,對 DownloadDataTaskAsync
的調用前面爲 await
關鍵字。 應用將事件處理程序執行(從顯示 await
的點開始)移至後臺線程,直到 DownloadDataTaskAsync
完成並返回。 同時,應用的 UI 線程仍能夠響應用戶輸入,並激發其餘控件的事件處理程序。 當 DownloadDataTaskAsync
完成時(這可能須要幾秒鐘),執行將恢復,其中 bytes
變量設置爲調用 DownloadDataTaskAsync
的結果,事件處理程序代碼的其他部分在調用方的 (UI) 線程上顯示下載的映像。
有關 C# 中 async
/await
的說明,請參閱使用 Async 和 Await 的異步編程主題。 有關 Xamarin 對異步編程功能的支持的詳細信息,請參閱異步支持概述。
Java 中使用的不少語言關鍵字也在 C# 中使用。 還有大量的 Java 關鍵字在 C# 中具備以不一樣方式命名的等效對應項,以下表所示:
Java | C# | 說明 |
---|---|---|
boolean |
bool | 用於聲明布爾值 true 和 false。 |
extends |
: |
先於要從中繼承的類和接口。 |
implements |
: |
先於要從中繼承的類和接口。 |
import |
using | 從命名空間導入類型,還可用於建立命名空間別名。 |
final |
sealed | 防止類派生;防止方法和屬性在派生類中被重寫。 |
instanceof |
is | 評估對象與給定類型是否兼容。 |
native |
extern | 聲明外部實現的方法。 |
package |
namespace | 聲明一組相關對象的做用域。 |
T... |
params T | 指定採用可變數目的參數的方法參數。 |
super |
base | 用於從派生類中訪問父類的成員。 |
synchronized |
lock | 使用鎖獲取和發佈包裝代碼的關鍵部分。 |
此外,還有不少關鍵字是 C# 所特有的,且在 Java 中沒有對應項。 Xamarin.Android 代碼一般使用下面的 C# 關鍵字(讀取 Xamarin.Android 示例代碼時,可以使用此表做爲參考):
C# | 說明 |
---|---|
as | 在兼容的引用類型或能夠爲 null 的類型之間執行轉換。 |
async | 指定方法或 lambda 表達式爲異步。 |
await | 掛起方法執行,直到任務完成。 |
byte | 無符號的 8 位整數類型。 |
delegate | 用於封裝方法或匿名方法。 |
enum | 聲明枚舉,這是一組命名的常數。 |
event | 聲明發布者類中的一個事件。 |
fixed | 防止變量被重定位。 |
get |
定義檢索屬性值的訪問器方法。 |
in | 使一個參數接受泛型接口中派生程度更小的類型。 |
object | .NET Framework 中 Object 類型的別名。 |
out | 參數修飾符或泛型類型參數聲明。 |
override | 擴展或修改繼承成員的實現。 |
partial | 聲明要拆分爲多個文件的定義,或者將一個方法定義從其實現中分離出來。 |
readonly | 聲明只能在聲明時分配或由類構造函數分配的類成員。 |
ref | 經過引用(而非值)來傳遞參數。 |
set | 定義設置屬性值的訪問器方法。 |
string | .NET Framework 中 String 類型的別名。 |
struct | 封裝一組相關變量的值類型。 |
typeof | 獲取對象類型。 |
var | 聲明一個隱式類型局部變量。 |
value | 引用客戶端代碼想要分配到屬性的值。 |
virtual | 容許在派生類中重寫方法。 |
若是你有不但願轉換爲 C# 的現有 Java 功能,能夠在 Xamarin.Android 應用程序中經過兩種技術重複使用現有的 Java 庫:
建立 Java 綁定庫 – 經過此方法,你可使用 Xamarin 工具生成圍繞 Java 類型的 C# 包裝器。 這些包裝器稱爲「綁定」 。 所以,Xamarin.Android 應用程序能夠經過調用這些包裝器來使用 .jar 文件。
Java 本機接口 – Java 本機接口 (JNI) 是一個框架,使 C# 應用能夠調用 Java 代碼或者由 Java 代碼調用 。
有關這些技術的詳細信息,請參閱 Java 集成概述。
MSDN C# 編程指南是開始學習 C# 編程語言的絕佳方式,你可使用 C# 參考查找特定的 C# 語言功能。
一樣,Java 知識要求至少像瞭解 Java 語言同樣瞭解 Java 類庫,C# 實踐知識則要求熟悉 .NET framework。 Microsoft 的移動到面向 Java 開發人員的 C# 和 .NET Framework 學習數據包是從 Java 角度瞭解有關 .NET Framework 詳細信息的很是好的途徑(同時能夠更加深刻地瞭解 C#)。
當你準備好在 C# 中處理第一個 Xamarin.Android 項目時,Hello,Android 系列能夠幫助你生成第一個 Xamarin.Android 應用程序,並進一步增強你對經過 Xamarin 開發 Android 應用程序的基礎知識的瞭解。
本文從 Java 開發人員的角度提供有關 Xamarin.Android C# 編程環境的簡介。 它指出 C# 和 Java 之間的類似之處,同時解釋了它們的實際差別。 它介紹了程序集和命名空間,說明如何導入外部類型,並概述了訪問修飾符、泛型、類派生、調用基類方法、方法重寫以及事件處理方面的區別。 它介紹了在 Java 中不可用的 C# 功能,例如屬性、async
/await
異步編程、lambda、C# 委託和 C# 事件處理系統。 它包含一個涵蓋重要 C# 關鍵字的表格,說明如何與現有的 Java 庫進行交互操做,並提供用於進一步研究的相關文檔連接。
收藏好的文章時不時的能夠回顧一下!文章來源:https://docs.microsoft.com/zh-cn/xamarin/android/get-started/java-developers