Xamarin untuk pengembang Java

Jika Anda adalah pengembang Java, Anda siap memanfaatkan keterampilan dan kode yang ada di platform Xamarin sambil menuai manfaat penggunaan kembali kode C#. Anda akan menemukan bahwa sintaks C# sangat mirip dengan sintaks Java, dan kedua bahasa menyediakan fitur yang sangat mirip. Selain itu, Anda akan menemukan fitur unik untuk C# yang akan membuat kehidupan pengembangan Anda lebih mudah.

Gambaran Umum

Artikel ini menyediakan pengantar pemrograman C# untuk pengembang Java, terutama berfokus pada fitur bahasa C# yang akan Anda temui saat mengembangkan aplikasi Xamarin.Android. Selain itu, artikel ini menjelaskan bagaimana fitur-fitur ini berbeda dari rekan-rekan Java mereka, dan memperkenalkan fitur C# penting (relevan dengan Xamarin.Android) yang tidak tersedia di Java. Tautan ke materi referensi tambahan disertakan, sehingga Anda dapat menggunakan artikel ini sebagai titik "melompat" untuk studi lebih lanjut tentang C# dan .NET.

Jika Anda terbiasa dengan Java, Anda akan merasa langsung di rumah dengan sintaks C#. Sintaks C# sangat mirip dengan sintaks Java - C# adalah bahasa "kurung kurawal" seperti Java, C, dan C++. Dalam banyak hal, sintaks C# membaca seperti superset sintaks Java, tetapi dengan beberapa kata kunci yang diganti namanya dan ditambahkan.

Banyak karakteristik utama Java dapat ditemukan di C#:

  • Pemrograman berorientasi objek berbasis kelas

  • Penjenisan kuat

  • Dukungan untuk antarmuka

  • Generik

  • Pengumpulan Sampah

  • Kompilasi runtime

Java dan C# dikompilasi ke bahasa perantara yang dijalankan di lingkungan eksekusi terkelola. C# dan Java diketik secara statis, dan kedua bahasa memperlakukan string sebagai jenis yang tidak dapat diubah. Kedua bahasa menggunakan hierarki kelas berakar tunggal. Seperti Java, C# hanya mendukung warisan tunggal dan tidak memungkinkan metode global. Dalam kedua bahasa, objek dibuat pada tumpukan menggunakan new kata kunci, dan objek dikumpulkan sampah ketika tidak lagi digunakan. Kedua bahasa menyediakan dukungan penanganan pengecualian formal dengan try/catch semantik. Keduanya menyediakan manajemen utas dan dukungan sinkronisasi.

Namun, ada banyak perbedaan antara Java dan C#. Contohnya:

  • Di Java, Anda dapat meneruskan parameter hanya berdasarkan nilai, sementara di C# Anda dapat meneruskan referensi serta berdasarkan nilai. (C# menyediakan ref kata kunci dan out untuk meneruskan parameter dengan referensi; tidak ada yang setara dengan ini di Java).

  • Java tidak mendukung direktif pra-prosesor seperti #define.

  • Java tidak mendukung jenis bilangan bulat yang tidak ditandatangani, sementara C# menyediakan jenis bilangan bulat yang tidak ditandatangani seperti ulong, , uintushort dan byte.

  • Java tidak mendukung kelebihan beban operator; di C# Anda dapat membebani operator dan konversi berlebih.

  • Dalam pernyataan Java switch , kode dapat masuk ke bagian sakelar berikutnya, tetapi di C# akhir setiap switch bagian harus mengakhiri sakelar (akhir setiap bagian harus ditutup dengan break pernyataan).

  • Di Java, Anda menentukan pengecualian yang dilemparkan oleh metode dengan throws kata kunci, tetapi C# tidak memiliki konsep pengecualian yang diperiksa - throws kata kunci tidak didukung dalam C#.

  • C# mendukung Language-Integrated Query (LINQ), yang memungkinkan Anda menggunakan kata fromyang dipesan , , selectdan where untuk menulis kueri terhadap koleksi dengan cara yang mirip dengan kueri database.

Tentu saja, ada lebih banyak perbedaan antara C# dan Java daripada yang dapat dibahas dalam artikel ini. Selain itu, Java dan C# terus berkembang (misalnya, Java 8, yang belum ada di toolchain Android, mendukung ekspresi lambda gaya C#) sehingga perbedaan ini akan berubah dari waktu ke waktu. Hanya perbedaan terpenting yang saat ini dihadapi oleh pengembang Java yang baru menggunakan Xamarin.Android yang diuraikan di sini.

  • Pergi dari Java ke C# Development memberikan pengantar perbedaan mendasar antara C# dan Java.

  • Fitur Pemrograman Berorientasi Objek menguraikan perbedaan fitur berorientasi objek paling penting antara kedua bahasa tersebut.

  • Perbedaan Kata Kunci menyediakan tabel yang setara dengan kata kunci yang berguna, kata kunci C#-only, dan tautan ke definisi kata kunci C#.

C# menghadirkan banyak fitur utama ke Xamarin.Android yang saat ini tidak tersedia untuk pengembang Java di Android. Fitur-fitur ini dapat membantu Anda menulis kode yang lebih baik dalam waktu yang lebih singkat:

  • Properti – Dengan sistem properti C#, Anda dapat mengakses variabel anggota dengan aman dan langsung tanpa harus menulis metode setter dan getter.

  • Lambda Expressions – Dalam C# Anda dapat menggunakan metode anonim (juga disebut lambda) untuk mengekspresikan fungsionalitas Anda dengan lebih ringkas dan lebih efisien. Anda dapat menghindari overhead harus menulis objek sekali pakai, dan Anda dapat meneruskan status lokal ke metode tanpa harus menambahkan parameter.

  • Penanganan Peristiwa – C# menyediakan dukungan tingkat bahasa untuk pemrograman berbasis peristiwa, di mana objek dapat mendaftar untuk diberi tahu ketika peristiwa menarik terjadi. Kata event kunci mendefinisikan mekanisme siaran multicast yang dapat digunakan kelas penerbit untuk memberi tahu pelanggan peristiwa.

  • Pemrograman Asinkron – Fitur pemrograman asinkron C# (async/await) menjaga aplikasi tetap responsif. Dukungan tingkat bahasa fitur ini membuat pemrograman asinkron mudah diimplementasikan dan kurang rawan kesalahan.

Terakhir, Xamarin memungkinkan Anda memanfaatkan aset Java yang ada melalui teknologi yang dikenal sebagai pengikatan. Anda dapat memanggil kode, kerangka kerja, dan pustaka Java yang ada dari C# dengan menggunakan generator pengikatan otomatis Xamarin. Untuk melakukan ini, Anda cukup membuat pustaka statis di Java dan mengeksposnya ke C# melalui pengikatan.

Catatan

Pemrograman Android menggunakan versi tertentu dari bahasa Java yang mendukung semua fitur Java 7 dan subset Java 8.

Beberapa fitur yang disebutkan di halaman ini (seperti var kata kunci di C#) tersedia di versi Java yang lebih baru (misalnya var di Java 10), tetapi masih belum tersedia untuk pengembang Android.

Dari pengembangan Java ke C#

Bagian berikut menguraikan perbedaan dasar "memulai" antara C# dan Java; bagian selanjutnya menjelaskan perbedaan berorientasi objek antara bahasa ini.

Pustaka vs. rakitan

Java biasanya mengemas kelas terkait dalam file .jar . Namun, dalam C# dan .NET, bit yang dapat digunakan kembali dari kode yang telah dikompilasi dipaketkan ke dalam rakitan, yang biasanya dipaketkan sebagai file .dll . Rakitan adalah unit penyebaran untuk kode C#/.NET, dan setiap rakitan biasanya dikaitkan dengan proyek C#. Rakitan berisi kode menengah (IL) yang tepat waktu yang dikompilasi pada runtime.

Untuk informasi selengkapnya tentang rakitan, lihat topik Assembly dan Global Assembly Cache .

Paket vs. namespace

C# menggunakan namespace kata kunci untuk mengelompokkan jenis terkait bersama-sama; ini mirip dengan kata kunci Java package . Biasanya, aplikasi Xamarin.Android akan berada di namespace yang dibuat untuk aplikasi tersebut. Misalnya, kode C# berikut mendeklarasikan pembungkus WeatherApp namespace untuk aplikasi pelaporan cuaca:

namespace WeatherApp
{
    ...

Mengimpor jenis

Saat Anda menggunakan jenis yang ditentukan dalam namespace eksternal, Anda mengimpor jenis ini dengan using pernyataan (yang sangat mirip dengan pernyataan Java import ). Di Java, Anda mungkin mengimpor satu jenis dengan pernyataan seperti berikut ini:

import javax.swing.JButton

Anda mungkin mengimpor seluruh paket Java dengan pernyataan seperti ini:

import javax.swing.*

Pernyataan C# using berfungsi dengan cara yang sangat mirip, tetapi memungkinkan Anda mengimpor seluruh paket tanpa menentukan kartubebas. Misalnya, Anda akan sering melihat serangkaian using pernyataan di awal file sumber Xamarin.Android, seperti yang terlihat dalam contoh ini:

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;

Pernyataan ini mengimpor fungsionalitas dari Systemnamespace , , Android.AppAndroid.Content, dll.

Generik

Java dan C# mendukung generik, yang merupakan tempat penampung yang memungkinkan Anda mencolokkan berbagai jenis pada waktu kompilasi. Namun, generik bekerja sedikit berbeda di C#. Di Java, penghapusan jenis membuat informasi jenis hanya tersedia pada waktu kompilasi, tetapi tidak pada waktu proses. Sebaliknya, .NET common language runtime (CLR) menyediakan dukungan eksplisit untuk jenis generik, yang berarti bahwa C# memiliki akses untuk mengetik informasi saat runtime. Dalam pengembangan Xamarin.Android sehari-hari, pentingnya perbedaan ini tidak sering terlihat, tetapi jika Anda menggunakan refleksi, Anda akan bergantung pada fitur ini untuk mengakses informasi jenis pada waktu proses.

Di Xamarin.Android, Anda akan sering melihat metode FindViewById generik yang digunakan untuk mendapatkan referensi ke kontrol tata letak. Metode ini menerima parameter jenis generik yang menentukan jenis kontrol untuk dicari. Contohnya:

TextView label = FindViewById<TextView> (Resource.Id.Label);

Dalam contoh kode ini, FindViewById mendapatkan referensi ke TextView kontrol yang didefinisikan dalam tata letak sebagai Label, lalu mengembalikannya sebagai TextView jenis.

Untuk informasi selengkapnya tentang generik, lihat topik Generik . Perhatikan bahwa ada beberapa batasan dalam dukungan Xamarin.Android untuk kelas C# generik; untuk informasi selengkapnya, lihat Batasan.

Fitur pemrograman berorientasi objek

Java dan C# menggunakan idiom pemrograman berorientasi objek yang sangat mirip:

  • Semua kelas pada akhirnya berasal dari satu objek akar - semua objek Java berasal dari java.lang.Object, sementara semua objek C# berasal dari System.Object.

  • Instans kelas adalah jenis referensi.

  • Saat Anda mengakses properti dan metode instans, Anda menggunakan operator ""..

  • Semua instans kelas dibuat pada timbunan new melalui operator.

  • Karena kedua bahasa menggunakan pengumpulan sampah, tidak ada cara untuk secara eksplisit melepaskan objek yang tidak digunakan (yaitu, tidak delete ada kata kunci karena ada di C++).

  • Anda dapat memperluas kelas melalui pewarisan, dan kedua bahasa hanya mengizinkan satu kelas dasar per jenis.

  • Anda dapat menentukan antarmuka, dan kelas dapat mewarisi dari (yaitu, mengimplementasikan) beberapa definisi antarmuka.

Namun, ada juga beberapa perbedaan penting:

  • Java memiliki dua fitur canggih yang tidak didukung C#: kelas anonim dan kelas dalam. (Namun, C# memungkinkan bersarangnya definisi kelas - kelas berlapis C#seperti kelas berlapis statis Java.)

  • C# mendukung jenis struktur gaya C (struct) sementara Java tidak.

  • Di C#, Anda dapat menerapkan definisi kelas dalam file sumber terpisah dengan menggunakan partial kata kunci.

  • Antarmuka C# tidak dapat mendeklarasikan bidang.

  • C# menggunakan sintaks destruktor gaya C++untuk mengekspresikan finalizer. Sintaksnya berbeda dari metode Java finalize , tetapi semantiknya hampir sama. (Perhatikan bahwa dalam C#, destruktor secara otomatis memanggil destruktor kelas dasar – berbeda dengan Java tempat panggilan super.finalize eksplisit digunakan.)

Warisan kelas

Untuk memperluas kelas di Java, Anda menggunakan extends kata kunci. Untuk memperluas kelas di C#, Anda menggunakan titik dua (:) untuk menunjukkan derivasi. Misalnya, di aplikasi Xamarin.Android, Anda akan sering melihat turunan kelas yang menyerupai fragmen kode berikut:

public class MainActivity : Activity
{
    ...

Dalam contoh ini, MainActivity mewarisi dari Activity kelas .

Untuk mendeklarasikan dukungan untuk antarmuka di Java, Anda menggunakan implements kata kunci. Namun, di C#, Anda cukup menambahkan nama antarmuka ke daftar kelas untuk diwarisi, seperti yang ditunjukkan dalam fragmen kode ini:

public class SensorsActivity : Activity, ISensorEventListener
{
    ...

Dalam contoh ini, SensorsActivity mewarisi dari Activity dan mengimplementasikan fungsionalitas yang dideklarasikan dalam ISensorEventListener antarmuka. Perhatikan bahwa daftar antarmuka harus datang setelah kelas dasar (atau Anda akan mendapatkan kesalahan waktu kompilasi). Menurut konvensi, nama antarmuka C# didahului dengan huruf besar "I"; ini memungkinkan untuk menentukan kelas mana yang merupakan antarmuka tanpa memerlukan implements kata kunci.

Ketika Anda ingin mencegah kelas disubkelas lebih lanjut dalam C#, Anda mendahului nama kelas dengan sealed - di Java, Anda mendahului nama kelas dengan final.

Untuk informasi selengkapnya tentang definisi kelas C#, lihat topik Kelas dan Warisan .

Properti

Di Java, metode mutator (setter) dan metode pemeriksa (getter) sering digunakan untuk mengontrol bagaimana perubahan dilakukan pada anggota kelas sambil menyembunyikan dan melindungi anggota ini dari kode luar. Misalnya, kelas Android TextView menyediakan getText metode dan setText . C# menyediakan mekanisme serupa tetapi lebih langsung yang dikenal sebagai properti. Pengguna kelas C# dapat mengakses properti dengan cara yang sama seperti mereka akan mengakses bidang, tetapi setiap akses benar-benar menghasilkan panggilan metode yang transparan bagi pemanggil. Metode "di bawah sampul" ini dapat menerapkan efek samping seperti mengatur nilai lain, melakukan konversi, atau mengubah status objek.

Properti sering digunakan untuk mengakses dan memodifikasi anggota objek UI (antarmuka pengguna). Contohnya:

int width = rulerView.MeasuredWidth;
int height = rulerView.MeasuredHeight;
...
rulerView.DrawingCacheEnabled = true;

Dalam contoh ini, nilai lebar dan tinggi dibaca dari rulerView objek dengan mengakses properti dan MeasuredHeight miliknyaMeasuredWidth. Ketika properti ini dibaca, nilai dari nilai bidang terkait (tetapi tersembunyi) diambil di belakang layar dan dikembalikan ke pemanggil. Objek rulerView dapat menyimpan nilai lebar dan tinggi dalam satu unit pengukuran (misalnya, piksel) dan mengonversi nilai-nilai ini dengan cepat ke unit pengukuran yang berbeda (misalnya, milimeter) saat MeasuredWidth properti dan MeasuredHeight diakses.

Objek rulerView juga memiliki properti yang disebut DrawingCacheEnabled – kode contoh mengatur properti ini untuk true mengaktifkan cache gambar di rulerView. Di balik layar, bidang tersembunyi terkait diperbarui dengan nilai baru, dan mungkin aspek rulerView status lainnya dimodifikasi. Misalnya, ketika DrawingCacheEnabled diatur ke false, rulerView juga dapat menghapus informasi cache gambar yang sudah terakumulasi dalam objek.

Akses ke properti bisa baca/tulis, baca-saja, atau tulis-saja. Selain itu, Anda dapat menggunakan pengubah akses yang berbeda untuk membaca dan menulis. Misalnya, Anda dapat menentukan properti yang memiliki akses baca publik tetapi akses tulis privat.

Untuk informasi selengkapnya tentang properti C#, lihat topik Properti .

Memanggil metode kelas dasar

Untuk memanggil konstruktor kelas dasar di C#, Anda menggunakan titik dua (:) diikuti oleh base kata kunci dan daftar inisialisasi; panggilan konstruktor ini base ditempatkan segera setelah daftar parameter konstruktor turunan. Konstruktor kelas dasar dipanggil pada entri ke konstruktor turunan; pengkompilasi menyisipkan panggilan ke konstruktor dasar di awal isi metode. Fragmen kode berikut mengilustrasikan konstruktor dasar yang disebut dari konstruktor turunan di aplikasi Xamarin.Android:

public class PictureLayout : ViewGroup
{
    ...
    public PictureLayout (Context context)
           : base (context)
    {
        ...
    }
    ...
}

Dalam contoh ini, PictureLayout kelas berasal dari ViewGroup kelas . PictureLayout Konstruktor yang ditunjukkan dalam contoh ini menerima context argumen dan meneruskannya ke ViewGroup konstruktor melalui base(context) panggilan.

Untuk memanggil metode kelas dasar di C#, gunakan base kata kunci. Misalnya, aplikasi Xamarin.Android sering melakukan panggilan ke metode dasar seperti yang ditunjukkan di sini:

public class MainActivity : Activity
{
    ...
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

Dalam hal ini, metode yang OnCreate ditentukan oleh kelas turunan (MainActivity) memanggil OnCreate metode kelas dasar (Activity).

Pengubah akses

Java dan C# mendukung publicpengubah akses , private, dan protected . Namun, C# mendukung dua pengubah akses tambahan:

  • internal – Anggota kelas hanya dapat diakses dalam rakitan saat ini.

  • protected internal – Anggota kelas dapat diakses dalam rakitan yang menentukan, kelas yang menentukan, dan kelas turunan (kelas turunan baik di dalam maupun di luar rakitan memiliki akses).

Untuk informasi selengkapnya tentang pengubah akses C#, lihat topik Pengubah Akses.

Metode virtual dan ambil alih

Baik Java maupun C# mendukung polimorfisme, kemampuan untuk memperlakukan objek terkait dengan cara yang sama. Dalam kedua bahasa, Anda dapat menggunakan referensi kelas dasar untuk merujuk ke objek kelas turunan, dan metode kelas turunan dapat mengambil alih metode kelas dasarnya. Kedua bahasa memiliki konsep metode virtual , metode dalam kelas dasar yang dirancang untuk digantikan oleh metode dalam kelas turunan. Seperti Java, C# mendukung abstract kelas dan metode.

Namun, ada beberapa perbedaan antara Java dan C# dalam cara Anda mendeklarasikan metode virtual dan mengambil alihnya:

  • Di C#, metode non-virtual secara default. Kelas induk harus secara eksplisit memberi label metode mana yang akan diambil alih dengan menggunakan virtual kata kunci. Sebaliknya, semua metode di Java adalah metode virtual secara default.

  • Untuk mencegah metode ditimpa di C#, Anda cukup meninggalkan virtual kata kunci. Sebaliknya, Java menggunakan final kata kunci untuk menandai metode dengan "penimpaan tidak diizinkan."

  • Kelas turunan C# harus menggunakan override kata kunci untuk secara eksplisit menunjukkan bahwa metode kelas dasar virtual sedang ditimpa.

Untuk informasi selengkapnya tentang dukungan C#untuk polimorfisme, lihat topik Polimorfisme .

Ekspresi Lambda

C# memungkinkan untuk membuat penutupan: sebaris, metode anonim yang dapat mengakses status metode di mana mereka diapit. Dengan menggunakan ekspresi lambda, Anda dapat menulis lebih sedikit baris kode untuk mengimplementasikan fungsionalitas yang sama dengan yang mungkin telah Anda terapkan di Java dengan lebih banyak baris kode.

Ekspresi Lambda memungkinkan Anda untuk melewati upacara tambahan yang terlibat dalam membuat kelas sekali pakai atau kelas anonim seperti yang Anda lakukan di Java - sebagai gantinya, Anda hanya dapat menulis logika bisnis dari kode metode Anda sebaris. Selain itu, karena lambda memiliki akses ke variabel dalam metode di sekitarnya, Anda tidak perlu membuat daftar parameter panjang untuk meneruskan status ke kode metode Anda.

Di C#, ekspresi lambda dibuat dengan => operator seperti yang ditunjukkan di sini:

(arg1, arg2, ...) => {
    // implementation code
};

Di Xamarin.Android, ekspresi lambda sering digunakan untuk menentukan penanganan aktivitas. Contohnya:

button.Click += (sender, args) => {
    clickCount += 1;    // access variable in surrounding code
    button.Text = string.Format ("Clicked {0} times.", clickCount);
};

Dalam contoh ini, kode ekspresi lambda (kode dalam kurung kurawal) menaikkan jumlah klik dan memperbarui button teks untuk menampilkan jumlah klik. Ekspresi lambda ini terdaftar dengan button objek sebagai penanganan aktivitas klik untuk dipanggil setiap kali tombol diketuk. (Penanganan aktivitas dijelaskan secara lebih rinci di bawah ini.) Dalam contoh sederhana ini, sender parameter dan args tidak digunakan oleh kode ekspresi lambda, tetapi diperlukan dalam ekspresi lambda untuk memenuhi persyaratan tanda tangan metode untuk pendaftaran peristiwa. Di bawah tenda, pengompilasi C# menerjemahkan ekspresi lambda ke dalam metode anonim yang dipanggil setiap kali peristiwa klik tombol terjadi.

Untuk informasi selengkapnya tentang ekspresi C# dan lambda, lihat topik Ekspresi Lambda.

Penanganan acara

Peristiwa adalah cara bagi objek untuk memberi tahu pelanggan terdaftar ketika sesuatu yang menarik terjadi pada objek tersebut. Tidak seperti di Java, di mana pelanggan biasanya mengimplementasikan Listener antarmuka yang berisi metode panggilan balik, C# menyediakan dukungan tingkat bahasa untuk penanganan peristiwa melalui delegasi. Delegasi seperti penunjuk fungsi jenis aman berorientasi objek - itu merangkum referensi objek dan token metode. Jika objek klien ingin berlangganan peristiwa, objek tersebut membuat delegasi dan meneruskan delegasi ke objek pemberitahuan. Ketika peristiwa terjadi, objek pemberitahuan memanggil metode yang diwakili oleh objek delegasi, memberi tahu objek klien yang berlangganan peristiwa. Di C#, penanganan aktivitas pada dasarnya tidak lebih dari metode yang dipanggil melalui delegasi.

Untuk informasi selengkapnya tentang delegasi, lihat topik Delegasi .

Di C#, peristiwa bersifat multicast; yaitu, lebih dari satu pendengar dapat diberi tahu saat peristiwa berlangsung. Perbedaan ini diamati ketika Anda mempertimbangkan perbedaan sinonis antara pendaftaran peristiwa Java dan C#. Di Java, Anda memanggil SetXXXListener untuk mendaftar untuk pemberitahuan peristiwa; di C# Anda menggunakan += operator untuk mendaftar pemberitahuan peristiwa dengan "menambahkan" delegasi Anda ke daftar pendengar peristiwa. Di Java, Anda memanggil SetXXXListener untuk membatalkan pendaftaran, sementara di C# Anda menggunakan -= untuk "mengurangi" delegasi Anda dari daftar pendengar.

Di Xamarin.Android, peristiwa sering digunakan untuk memberi tahu objek ketika pengguna melakukan sesuatu pada kontrol UI. Biasanya, kontrol UI akan memiliki anggota yang didefinisikan menggunakan kata kunci; Anda melampirkan delegasi Anda ke anggota ini untuk berlangganan peristiwa dari kontrol UI tersebut event .

Untuk berlangganan acara:

  1. Buat objek delegasi yang mengacu pada metode yang ingin Anda panggil saat peristiwa terjadi.

  2. += Gunakan operator untuk melampirkan delegasi Anda ke acara yang Anda berlangganan.

Contoh berikut mendefinisikan delegasi (dengan penggunaan delegate eksplisit kata kunci) untuk berlangganan klik tombol. Handler klik tombol ini memulai aktivitas baru:

startActivityButton.Click += delegate {
    Intent intent = new Intent (this, typeof (MyActivity));
    StartActivity (intent);
};

Namun, Anda juga dapat menggunakan ekspresi lambda untuk mendaftar peristiwa, melewati delegate kata kunci sama sekali. Contohnya:

startActivityButton.Click += (sender, e) => {
    Intent intent = new Intent (this, typeof (MyActivity));
    StartActivity (intent);
};

Dalam contoh ini, startActivityButton objek memiliki peristiwa yang mengharapkan delegasi dengan tanda tangan metode tertentu: objek yang menerima pengirim dan argumen peristiwa dan mengembalikan kekosongan. Namun, karena kami tidak ingin pergi ke masalah untuk secara eksplisit mendefinisikan delegasi seperti itu atau metodenya, kami menyatakan tanda tangan metode dengan (sender, e) dan menggunakan ekspresi lambda untuk mengimplementasikan isi penanganan aktivitas. Perhatikan bahwa kita harus mendeklarasikan daftar parameter ini meskipun kita tidak menggunakan sender parameter dan e .

Penting untuk diingat bahwa Anda dapat berhenti berlangganan delegasi (melalui -= operator), tetapi Anda tidak dapat berhenti berlangganan ekspresi lambda - mencoba melakukannya dapat menyebabkan kebocoran memori. Gunakan bentuk lambda pendaftaran peristiwa hanya ketika handler Anda tidak akan berhenti berlangganan dari acara.

Biasanya, ekspresi lambda digunakan untuk mendeklarasikan penanganan aktivitas dalam kode Xamarin.Android. Cara singkat ini untuk mendeklarasikan penanganan aktivitas mungkin tampak samar pada awalnya, tetapi menghemat banyak waktu ketika Anda menulis dan membaca kode. Dengan meningkatnya keakraban, Anda terbiasa mengenali pola ini (yang sering terjadi dalam kode Xamarin.Android), dan Anda menghabiskan lebih banyak waktu untuk memikirkan logika bisnis aplikasi Anda dan lebih sedikit waktu mengarungi overhead sinonis.

Pemrograman asinkron

Pemrograman asinkron adalah cara untuk meningkatkan respons keseluruhan aplikasi Anda. Fitur pemrograman asinkron memungkinkan sisa kode aplikasi Anda untuk terus berjalan saat beberapa bagian aplikasi Anda diblokir oleh operasi yang panjang. Mengakses web, memproses gambar, dan membaca/menulis file adalah contoh operasi yang dapat menyebabkan seluruh aplikasi tampak membeku jika tidak ditulis secara asinkron.

C# mencakup dukungan tingkat bahasa untuk pemrograman asinkron melalui async kata kunci dan await . Fitur bahasa ini membuatnya sangat mudah untuk menulis kode yang melakukan tugas jangka panjang tanpa memblokir utas utama aplikasi Anda. Secara singkat, Anda menggunakan async kata kunci pada metode untuk menunjukkan bahwa kode dalam metode ini adalah menjalankan secara asinkron dan tidak memblokir utas pemanggil. Anda menggunakan await kata kunci saat memanggil metode yang ditandai dengan async. Pengkompilasi menginterpretasikan sebagai titik di mana eksekusi metode Anda akan dipindahkan ke utas await latar belakang (tugas dikembalikan ke pemanggil). Ketika tugas ini selesai, eksekusi kode dilanjutkan pada utas pemanggil pada await titik dalam kode Anda, mengembalikan hasil async panggilan. Menurut konvensi, metode yang berjalan secara asinkron telah Async dicukupkan ke nama mereka.

Dalam aplikasi Xamarin.Android, async dan await biasanya digunakan untuk membebaskan utas UI sehingga dapat merespons input pengguna (seperti mengetuk tombol Batal ) saat operasi jangka panjang berlangsung dalam tugas latar belakang.

Dalam contoh berikut, penangan aktivitas klik tombol menyebabkan operasi asinkron mengunduh gambar dari 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 ...

Dalam contoh ini, ketika pengguna mengklik downloadButton kontrol, downloadAsync penanganan aktivitas membuat WebClient objek dan Uri objek untuk mengambil gambar dari URL yang ditentukan. Selanjutnya, ini memanggil WebClient metode objek DownloadDataTaskAsync dengan URL ini untuk mengambil gambar.

Perhatikan bahwa deklarasi downloadAsync metode diawali oleh async kata kunci untuk menunjukkan bahwa metode akan berjalan secara asinkron dan mengembalikan tugas. Perhatikan juga bahwa panggilan ke DownloadDataTaskAsync didahului oleh await kata kunci. Aplikasi memindahkan eksekusi penanganan aktivitas (dimulai pada titik di mana await muncul) ke utas latar belakang hingga DownloadDataTaskAsync selesai dan kembali. Sementara itu, utas UI aplikasi masih dapat merespons input pengguna dan mengaktifkan penanganan aktivitas untuk kontrol lainnya. Ketika DownloadDataTaskAsync selesai (yang mungkin memakan waktu beberapa detik), eksekusi dilanjutkan di mana bytes variabel diatur ke hasil panggilan ke DownloadDataTaskAsync, dan sisa kode penanganan aktivitas menampilkan gambar yang diunduh pada utas (UI) pemanggil.

Untuk pengenalan asyncawait/di C#, lihat topik Pemrograman Asinkron dengan Asinkron dan Tunggu. Untuk informasi selengkapnya tentang dukungan Xamarin fitur pemrograman asinkron, lihat Gambaran Umum Dukungan Asinkron.

Perbedaan kata kunci

Banyak kata kunci bahasa yang digunakan dalam Java juga digunakan dalam C#. Ada juga sejumlah kata kunci Java yang memiliki mitra yang setara tetapi bernama berbeda di C#, seperti yang tercantum dalam tabel ini:

Java C# Deskripsi
boolean bool Digunakan untuk mendeklarasikan nilai boolean benar dan salah.
extends : Mendahului kelas dan antarmuka untuk diwariskan.
implements : Mendahului kelas dan antarmuka untuk diwariskan.
import using Mengimpor jenis dari namespace layanan, juga digunakan untuk membuat alias namespace.
final disegel Mencegah turunan kelas; mencegah metode dan properti ditimpa dalam kelas turunan.
instanceof is Mengevaluasi apakah objek kompatibel dengan jenis tertentu.
native eksternal Mendeklarasikan metode yang diimplementasikan secara eksternal.
package namespace Mendeklarasikan cakupan untuk sekumpulan objek terkait.
T... params T Menentukan parameter metode yang mengambil jumlah variabel argumen.
super dasar Digunakan untuk mengakses anggota kelas induk dari dalam kelas turunan.
synchronized kunci Membungkus bagian penting dari kode dengan akuisisi dan rilis kunci.

Selain itu, ada banyak kata kunci yang unik untuk C# dan tidak memiliki mitra di Java yang digunakan di Android. Kode Xamarin.Android sering menggunakan kata kunci C# berikut (tabel ini berguna untuk dirujuk ketika Anda membaca kode sampel Xamarin.Android):

C# Deskripsi
Sebagai Melakukan konversi antara jenis referensi yang kompatibel atau jenis nullable.
async Menentukan bahwa metode atau ekspresi lambda bersifat asinkron.
Menunggu Menangguhkan eksekusi metode hingga tugas selesai.
byte Tipe bilangan bulat 8-bit yang tidak ditandatangani.
delegasi Digunakan untuk merangkum metode atau metode anonim.
enum Mendeklarasikan enumerasi, sekumpulan konstanta bernama.
event Mendeklarasikan peristiwa di kelas penerbit.
Teratasi Mencegah variabel direlokasi.
get Menentukan metode aksesor yang mengambil nilai properti.
in Memungkinkan parameter untuk menerima jenis yang kurang diturunkan dalam antarmuka generik.
object Alias untuk jenis Objek dalam kerangka kerja .NET.
out Pengubah parameter atau deklarasi parameter jenis generik.
Menimpa Memperluas atau memodifikasi implementasi anggota yang diwariskan.
partial Menyatakan definisi yang akan dibagi menjadi beberapa file, atau membagi definisi metode dari implementasinya.
hanyabaca Menyatakan bahwa anggota kelas hanya dapat ditetapkan pada waktu deklarasi atau oleh konstruktor kelas.
ref Menyebabkan argumen diteruskan oleh referensi daripada berdasarkan nilai.
set Menentukan metode aksesor yang menetapkan nilai properti.
tali Alias untuk jenis String dalam kerangka kerja .NET.
struktur Jenis nilai yang merangkum sekelompok variabel terkait.
jenisdari Mendapatkan jenis objek.
var Menyatakan variabel lokal yang diketik secara implisit.
value Mereferensikan nilai yang ingin ditetapkan kode klien ke properti.
virtual Memungkinkan metode untuk ditimpa dalam kelas turunan.

Mengoperasikan dengan kode java yang ada

Jika Anda memiliki fungsiOnalitas Java yang tidak ingin Anda konversi ke C#, Anda dapat menggunakan kembali pustaka Java yang ada di aplikasi Xamarin.Android melalui dua teknik:

  • Buat Pustaka Pengikatan Java - Menggunakan pendekatan ini, Anda menggunakan alat Xamarin untuk menghasilkan pembungkus C# di sekitar jenis Java. Pembungkus ini disebut pengikatan. Akibatnya, aplikasi Xamarin.Android Anda dapat menggunakan file .jar Anda dengan memanggil ke pembungkus ini.

  • Java Native InterfaceJava Native Interface (JNI) adalah kerangka kerja yang memungkinkan aplikasi C# memanggil atau dipanggil oleh kode Java.

Untuk informasi selengkapnya tentang teknik ini, lihat Gambaran Umum Integrasi Java.

Bacaan lebih lanjut

Panduan Pemrograman MSDN C# adalah cara yang bagus untuk mulai mempelajari bahasa pemrograman C#, dan Anda dapat menggunakan Referensi C# untuk mencari fitur bahasa C# tertentu.

Dengan cara yang sama seperti pengetahuan Java setidaknya tentang keakraban dengan pustaka kelas Java seperti mengetahui bahasa Java, pengetahuan praktis tentang C# membutuhkan beberapa keakraban dengan kerangka kerja .NET. Paket pembelajaran Microsoft Pindah ke C# dan .NET Framework, untuk Pengembang Java adalah cara yang baik untuk mempelajari lebih lanjut tentang kerangka kerja .NET dari perspektif Java (sambil mendapatkan pemahaman yang lebih mendalam tentang C#).

Ketika Anda siap untuk mengatasi proyek Xamarin.Android pertama Anda di C#, seri Hello, Android kami dapat membantu Anda membangun aplikasi Xamarin.Android pertama Anda dan lebih lanjut memajukan pemahaman Anda tentang dasar-dasar pengembangan aplikasi Android dengan Xamarin.

Ringkasan

Artikel ini memberikan pengenalan lingkungan pemrograman Xamarin.Android C# dari perspektif pengembang Java. Ini menunjukkan kesamaan antara C# dan Java sambil menjelaskan perbedaan praktis mereka. Ini memperkenalkan rakitan dan namespace, menjelaskan cara mengimpor jenis eksternal, dan memberikan gambaran umum tentang perbedaan pengubah akses, generik, turunan kelas, memanggil metode kelas dasar, pengambil alihan metode, dan penanganan peristiwa. Ini memperkenalkan fitur C# yang tidak tersedia di Java, seperti properti, async/await pemrograman asinkron, lambda, delegasi C#, dan sistem penanganan peristiwa C#. Ini termasuk tabel kata kunci C# penting, menjelaskan cara beroperasi dengan pustaka Java yang ada, dan menyediakan tautan ke dokumentasi terkait untuk studi lebih lanjut.