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 danout
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
, ,uint
ushort
danbyte
.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 setiapswitch
bagian harus mengakhiri sakelar (akhir setiap bagian harus ditutup denganbreak
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
from
yang dipesan , ,select
danwhere
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 System
namespace , , Android.App
Android.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 dariSystem.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 panggilansuper.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 public
pengubah 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 menggunakanfinal
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:
Buat objek delegasi yang mengacu pada metode yang ingin Anda panggil saat peristiwa terjadi.
+=
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 async
await
/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 Interface – Java 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.