Java geliştiricileri için Xamarin
Java geliştiricisiyseniz, C# kodunun yeniden kullanım avantajlarını elde ederken Xamarin platformundaki becerilerinizi ve mevcut kodunuzu kullanmaya iyi gidiyorsunuz demektir. C# söz dizimlerinin Java söz dizimine çok benzer olduğunu ve her iki dilin de çok benzer özellikler sağladığını göreceksiniz. Buna ek olarak, geliştirme hayatınızı kolaylaştıracak C# özelliğine özgü özellikleri keşfedeceksiniz.
Genel bakış
Bu makale, Java geliştiricileri için C# programlamaya giriş niteliğindedir ve öncelikle Xamarin.Android uygulamaları geliştirirken karşılaşacağınız C# dil özelliklerine odaklanır. Ayrıca bu makalede, bu özelliklerin Java'daki karşılıklarından nasıl farklı olduğu açıklanır ve Java'da kullanılamayan önemli C# özellikleri (Xamarin.Android ile ilgili) tanıtılır. C# ve .NET'in daha fazla çalışması için bu makaleyi bir "atlama" noktası olarak kullanabilmeniz için ek başvuru malzemelerinin bağlantıları dahil edilir.
Java'yı biliyorsanız, C# söz dizimi ile kendinizi anında evinizde hissedeceksiniz. C# söz dizimi Java söz dizimine çok benzer– C# Java, C ve C++ gibi bir "küme ayracı" dilidir. C# söz dizimi birçok şekilde Java söz diziminin üst kümesi gibi okunur, ancak birkaç anahtar sözcük yeniden adlandırılmış ve eklenmiş.
Java'nın birçok temel özelliği C# dilinde bulunabilir:
Sınıf tabanlı nesne odaklı programlama
Güçlü yazma
Arabirim desteği
Genel Türler
Atık toplama
Çalışma zamanı derlemesi
Hem Java hem de C# yönetilen yürütme ortamında çalıştırılan bir ara dile derlenir. Hem C# hem de Java statik olarak yazılır ve her iki dil de dizeleri sabit türler olarak kabul eder.
Her iki dil de tek köklü sınıf hiyerarşisi kullanır. Java gibi C# da yalnızca tek devralmayı destekler ve genel yöntemlere izin vermez.
Her iki dilde de nesneler anahtar sözcüğü kullanılarak new
yığında oluşturulur ve nesneler artık kullanılmadığında çöp olarak toplanır. Her iki dil de semantik ile try
/catch
resmi özel durum işleme desteği sağlar. her ikisi de iş parçacığı yönetimi ve eşitleme desteği sağlar.
Ancak Java ile C# arasında birçok fark vardır. Örneğin:
Java'da parametreleri yalnızca değere göre geçirebilirsiniz; C# dilinde ise hem başvuruya hem de değere göre geçirebilirsiniz. (C#, parametreleri başvuruya
ref
göre geçirmek için veout
anahtar sözcüklerini sağlar; Java'da bunlara eşdeğer bir değer yoktur).Java gibi
#define
önişlemci yönergelerini desteklemez.Java işaretsiz tamsayı türlerini desteklemezken C# ,
uint
veushort
byte
gibiulong
işaretsiz tamsayı türleri sağlar.Java, işleç aşırı yüklemesini desteklemez; C# dilinde işleçleri ve dönüştürmeleri aşırı yükleyebilirsiniz.
Java
switch
deyiminde kod bir sonraki switch bölümüne geçebilir, ancak C# dilinde herswitch
bölümün sonu anahtarı sonlandırmalıdır (her bölümün sonu birbreak
deyimle kapatılmalıdır).Java'da, anahtar sözcüğüyle
throws
bir yöntem tarafından atılan özel durumları belirtirsiniz, ancak C# işaretli özel durumlar kavramına sahip değildir;throws
anahtar sözcük C# dilinde desteklenmez.C#, ayrılmış , ve
where
sözcüklerinifrom
select
kullanarak koleksiyonlara karşı veritabanı sorgularına benzer bir şekilde sorgu yazmanızı sağlayan DilLe Tümleşik Sorgu'yu (LINQ) destekler.
Elbette, C# ile Java arasında bu makalede ele alınabilecekten çok daha fazla fark vardır. Ayrıca, hem Java hem de C# gelişmeye devam eder (örneğin, henüz Android araç zincirinde olmayan Java 8, C#stili lambda ifadelerini destekler), bu nedenle bu farklılıklar zaman içinde değişir. Şu anda Xamarin.Android'de yeni olan Java geliştiricileri tarafından karşılaşılan en önemli farklar burada özetlenmiştir.
Java'dan C# Geliştirme'ye geçmek, C# ile Java arasındaki temel farklara giriş sağlar.
Nesne Odaklı Programlama Özellikleri , iki dil arasındaki en önemli nesne odaklı özellik farklarını özetler.
Anahtar Sözcük Farkları yararlı anahtar sözcük eşdeğerleri, yalnızca C#anahtar sözcükler ve C# anahtar sözcük tanımlarına bağlantılar içeren bir tablo sağlar.
C#, Xamarin.Android'e şu anda Android'de Java geliştiricileri tarafından kullanılamayan birçok önemli özellik getirir. Bu özellikler daha kısa sürede daha iyi kod yazmanıza yardımcı olabilir:
Özellikler – C#'nin özellik sistemiyle, setter ve getter yöntemleri yazmak zorunda kalmadan üye değişkenlerine güvenli ve doğrudan erişebilirsiniz.
Lambda İfadeleri – C# dilinde, işlevselliğinizi daha kısa ve verimli bir şekilde ifade etmek için anonim yöntemleri (lambda olarak da adlandırılır) kullanabilirsiniz. Tek kullanımlık nesneler yazma yükünden kaçınabilir ve parametre eklemek zorunda kalmadan yerel durumu bir yönteme geçirebilirsiniz.
Olay İşleme – C#, olay odaklı programlama için dil düzeyinde destek sağlar. Burada bir nesne, ilgili bir olay oluştuğunda bildirim almak üzere kaydedilebilir.
event
anahtar sözcüğü, yayımcı sınıfının olay abonelerini bilgilendirmek için kullanabileceği çok noktaya yayın mekanizmasını tanımlar.Zaman Uyumsuz Programlama – C# (
async
/await
) öğesinin zaman uyumsuz programlama özellikleri, uygulamaların yanıt vermesini sağlar. Bu özelliğin dil düzeyinde desteği, zaman uyumsuz programlamanın uygulanmasını kolaylaştırır ve hataya daha az açıktır.
Son olarak Xamarin, bağlama olarak bilinen bir teknoloji aracılığıyla mevcut Java varlıklarından yararlanmanızı sağlar. Xamarin'in otomatik bağlama oluşturucularını kullanarak mevcut Java kodunuzu, çerçevelerinizi ve kitaplıklarınızı C# dilinden çağırabilirsiniz. Bunu yapmak için Java'da statik bir kitaplık oluşturup bağlama aracılığıyla C# ile kullanıma sunmanız yeterlidir.
Not
Android programlama, java dilinin tüm Java 7 özelliklerini ve Java 8'in bir alt kümesini destekleyen belirli bir sürümünü kullanır.
Bu sayfada belirtilen bazı özellikler (C# dilinde anahtar var
sözcük gibi) Java'nın daha yeni sürümlerinde (örneğin var
Java 10'da) kullanılabilir ancak Android geliştiricileri tarafından hala kullanılamaz.
Java'dan C# geliştirmeye gitme
Aşağıdaki bölümlerde C# ile Java arasındaki temel "başlarken" farkları özetlenmiştir; Sonraki bir bölümde, bu diller arasındaki nesne odaklı farklar açıklanmaktadır.
Kitaplıklar ile derlemeler karşılaştırması
Java genellikle .jar dosyalarında ilgili sınıfları paketler. Ancak C# ve .NET'te, önceden derlenmiş kodun yeniden kullanılabilir bitleri, genellikle .dll dosyaları olarak paketlenen derlemeler halinde paketlenir. Derleme, C#/.NET kodu için bir dağıtım birimidir ve her derleme genellikle bir C# projesiyle ilişkilendirilir. Derlemeler, çalışma zamanında tam zamanında derlenmiş ara kod (IL) içerir.
Derlemeler hakkında daha fazla bilgi için Derlemeler ve Genel Derleme Önbelleği konusuna bakın.
Paketler ve ad alanları karşılaştırması
C# ilgili türleri birlikte gruplandırmak için anahtar sözcüğünü namespace
kullanır; bu, Java'nın package
anahtar sözcüğüne benzer. Genellikle, bir Xamarin.Android uygulaması bu uygulama için oluşturulan bir ad alanında yer alır. Örneğin, aşağıdaki C# kodu bir hava durumu raporlama uygulaması için ad alanı sarmalayıcısını bildirir WeatherApp
:
namespace WeatherApp
{
...
Türleri içeri aktarma
Dış ad alanları içinde tanımlanan türleri kullandığınızda, bu türleri bir using
deyimiyle (Java import
deyimine çok benzer) içeri aktarırsınız. Java'da, aşağıdaki gibi bir deyimle tek bir türü içeri aktarabilirsiniz:
import javax.swing.JButton
Aşağıdaki gibi bir deyimle java paketinin tamamını içeri aktarabilirsiniz:
import javax.swing.*
C# using
deyimi çok benzer şekilde çalışır, ancak joker karakter belirtmeden paketin tamamını içeri aktarmanıza olanak tanır. Örneğin, bu örnekte görüldüğü gibi Xamarin.Android kaynak dosyalarının başında genellikle bir dizi using
deyim görürsünüz:
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;
Bu deyimler, , Android.App
, Android.Content
vb. ad alanlarının System
işlevlerini içeri aktarır.
Genel Türler
Hem Java hem de C# derleme zamanında farklı türleri takmanıza olanak tanıyan yer tutucular olan genel türleri destekler. Ancak, genel değerler C# dilinde biraz farklı çalışır. Java'da tür silme, tür bilgilerini yalnızca derleme zamanında kullanılabilir hale getirir, ancak çalışma zamanında kullanılamaz. Buna karşılık, .NET ortak dil çalışma zamanı (CLR) genel türler için açık destek sağlar; bu da C# öğesinin çalışma zamanında tür bilgilerine erişimi olduğu anlamına gelir. Günlük Xamarin.Android geliştirmesinde, bu ayrımın önemi genellikle belirgin değildir, ancak yansıma kullanıyorsanız, çalışma zamanında tür bilgilerine erişmek için bu özelliğe bağımlı olursunuz.
Xamarin.Android'de genellikle düzen denetimine başvuru almak için kullanılan genel yöntemi FindViewById
görürsünüz. Bu yöntem, arama için denetim türünü belirten genel bir tür parametresi kabul eder. Örneğin:
TextView label = FindViewById<TextView> (Resource.Id.Label);
Bu kod örneğinde, FindViewById
düzende Etiket olarak tanımlanan denetime TextView
bir başvuru alır ve bunu bir TextView
tür olarak döndürür.
Genel bilgiler hakkında daha fazla bilgi için Genel Bilgiler konusuna bakın. Genel C# sınıfları için Xamarin.Android desteğinde bazı sınırlamalar olduğunu unutmayın; daha fazla bilgi için bkz . Sınırlamalar.
Nesne odaklı programlama özellikleri
Hem Java hem de C# çok benzer nesne odaklı programlama deyimleri kullanır:
Tüm sınıflar nihai olarak tek bir kök nesneden türetilir; tüm Java nesneleri öğesinden
java.lang.Object
türetilirken, tüm C# nesneleri öğesindenSystem.Object
türetilir.Sınıf örnekleri başvuru türleridir.
Bir örneğin özelliklerine ve yöntemlerine eriştiğinde "
.
" işlecini kullanırsınız.Tüm sınıf örnekleri işleci aracılığıyla yığında
new
oluşturulur.Her iki dil de çöp toplama kullandığından, kullanılmayan nesneleri açıkça serbest bırakmanın bir yolu yoktur (örneğin, C++'da olduğu gibi bir
delete
anahtar sözcük yoktur).Sınıfları devralma yoluyla genişletebilirsiniz ve her iki dil de tür başına yalnızca tek bir temel sınıfa izin verir.
Arabirimler tanımlayabilirsiniz ve bir sınıf birden çok arabirim tanımından (uygulama) devralabilir.
Ancak bazı önemli farklılıklar da vardır:
Java,C# tarafından desteklenmeyen iki güçlü özelliğe sahiptir: anonim sınıflar ve iç sınıflar. (Ancak, C# sınıf tanımlarının iç içe konulmasına izin verir; C#'nin iç içe sınıfları Java'nın statik iç içe sınıflarına benzer.)
C# C stili yapı türlerini (
struct
) desteklerken Java desteklemez.C# dilinde, anahtar sözcüğünü kullanarak
partial
ayrı kaynak dosyalarında bir sınıf tanımı uygulayabilirsiniz.C# arabirimleri alanları bildiremez.
C# sonlandırıcıları ifade etmek için C++stili yıkıcı söz dizimi kullanır. Söz dizimi Java'nın
finalize
yönteminden farklıdır, ancak semantik neredeyse aynıdır. (C# dilinde yıkıcıların, açık çağrısının kullanıldığı Java'nın aksine, temel sınıf yıkıcısınısuper.finalize
otomatik olarak çağırdığını unutmayın.)
Sınıf devralma
Java'da bir sınıfı genişletmek için anahtar sözcüğünü extends
kullanırsınız. C# dilinde bir sınıfı genişletmek için türetme belirtmek için iki nokta üst üste (:
) kullanırsınız. Örneğin, Xamarin.Android uygulamalarında genellikle aşağıdaki kod parçasına benzeyen sınıf türetmelerini görürsünüz:
public class MainActivity : Activity
{
...
Bu örnekte, MainActivity
sınıfından devralır Activity
.
Java'da bir arabirim için destek bildirmek için anahtar sözcüğünü implements
kullanırsınız. Ancak C# dilinde, bu kod parçasında gösterildiği gibi devralınacak sınıflar listesine arabirim adları eklemeniz yeterlidir:
public class SensorsActivity : Activity, ISensorEventListener
{
...
Bu örnekte, SensorsActivity
arabiriminden Activity
devralır ve arabiriminde ISensorEventListener
bildirilen işlevselliği uygular. Arabirim listesinin temel sınıftan sonra gelmesi gerektiğini unutmayın (aksi takdirde derleme zamanı hatası alırsınız). Kural gereği, C# arabirim adları büyük harf "I" ile eklenir; bu, anahtar implements
sözcük gerektirmeden hangi sınıfların arabirim olduğunu belirlemeyi mümkün kılar.
Bir sınıfın C# dilinde daha fazla alt sınıfa alınmasını önlemek istediğinizde, sınıf adının önüne ile sealed
, Java'da ise sınıf adının önüne ile final
geçebilirsiniz.
C# sınıf tanımları hakkında daha fazla bilgi için Sınıflar ve Devralma konularına bakın.
Properties
Java'da, mutator yöntemleri (ayarlayıcılar) ve denetçi yöntemleri (getters) genellikle bu üyeleri dış koddan gizleyip korurken sınıf üyelerinde yapılan değişikliklerin nasıl yapıldığını denetlemek için kullanılır. Örneğin, Android TextView
sınıfı ve setText
yöntemleri sağlargetText
. C#, özellikler olarak bilinen benzer ancak daha doğrudan bir mekanizma sağlar.
C# sınıfının kullanıcıları, bir özelliğe bir alana erişebilecekleri şekilde erişebilir, ancak her erişim aslında çağıran için saydam olan bir yöntem çağrısıyla sonuçlanır. Bu "kapakların altında" yöntemi, diğer değerleri ayarlama, dönüştürme gerçekleştirme veya nesne durumunu değiştirme gibi yan etkileri uygulayabilir.
Özellikler genellikle kullanıcı arabirimi (kullanıcı arabirimi) nesne üyelerine erişmek ve bunları değiştirmek için kullanılır. Örneğin:
int width = rulerView.MeasuredWidth;
int height = rulerView.MeasuredHeight;
...
rulerView.DrawingCacheEnabled = true;
Bu örnekte, genişlik ve yükseklik değerleri ve MeasuredHeight
özelliklerine erişilerek MeasuredWidth
nesneden rulerView
okunur. Bu özellikler okunduğunda, ilişkili (ancak gizli) alan değerlerinden değerler arka planda getirilir ve çağırana döndürülür. Nesne, rulerView
genişlik ve yükseklik değerlerini bir ölçü biriminde (örneğin piksel) depolayabilir ve ve özelliklerine erişildiğinde bu değerleri anında farklı bir ölçü birimine MeasuredWidth
MeasuredHeight
(örneğin, milimetre) dönüştürebilir.
rulerView
nesnesi de adlı DrawingCacheEnabled
bir özelliğe sahiptir; örnek kod, içinde çizim önbelleğini rulerView
etkinleştirmek için bu özelliği true
olarak ayarlar. Arka planda, ilişkili bir gizli alan yeni değerle güncelleştirilir ve büyük olasılıkla durumun diğer yönleri rulerView
değiştirilir. Örneğin, olarak ayarlandığında false
rulerView
nesnede DrawingCacheEnabled
zaten birikmiş çizim önbelleği bilgilerini de silebilir.
Özelliklere erişim okuma/yazma, salt okunur veya salt yazma olabilir. Ayrıca, okuma ve yazma için farklı erişim değiştiricileri de kullanabilirsiniz. Örneğin, genel okuma erişimi olan ancak özel yazma erişimi olan bir özellik tanımlayabilirsiniz.
C# özellikleri hakkında daha fazla bilgi için Özellikler konusuna bakın.
Temel sınıf yöntemlerini çağırma
C# dilinde bir temel sınıf oluşturucuyu çağırmak için, iki nokta üst üste (:
) ve ardından base
anahtar sözcüğünü ve başlatıcı listesini kullanırsınız; bu base
oluşturucu çağrısı, türetilmiş oluşturucu parametre listesinden hemen sonra yerleştirilir. Temel sınıf oluşturucu, türetilmiş oluşturucuya girişte çağrılır; derleyicisi, çağrıyı yöntem gövdesinin başındaki temel oluşturucuya ekler. Aşağıdaki kod parçası, Xamarin.Android uygulamasında türetilmiş bir oluşturucudan çağrılan bir temel oluşturucuyu gösterir:
public class PictureLayout : ViewGroup
{
...
public PictureLayout (Context context)
: base (context)
{
...
}
...
}
Bu örnekte sınıfı PictureLayout
sınıfından ViewGroup
türetilmiştir. PictureLayout
Bu örnekte gösterilen oluşturucu bir context
bağımsız değişkeni kabul eder ve çağrısı aracılığıyla oluşturucuya ViewGroup
base(context)
geçirir.
C# dilinde bir temel sınıf yöntemini çağırmak için anahtar sözcüğünü base
kullanın. Örneğin, Xamarin.Android uygulamaları genellikle burada gösterildiği gibi temel yöntemlere çağrı yapar:
public class MainActivity : Activity
{
...
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
Bu durumda, OnCreate
türetilmiş sınıf () tarafından tanımlanan yöntem, temel sınıfın (MainActivity
Activity
) yöntemini çağırırOnCreate
.
Erişim değiştiricileri
Java ve C# hem , private
hem protected
de erişim değiştiricilerini desteklerpublic
. Ancak C# iki ek erişim değiştiriciyi destekler:
internal
– Sınıf üyesine yalnızca geçerli derleme içinde erişilebilir.protected internal
– Sınıf üyesine tanımlama derlemesi, tanımlama sınıfı ve türetilmiş sınıflar (derlemenin içinde ve dışında türetilmiş sınıfların erişimi vardır) içinde erişilebilir.
C# erişim değiştiricileri hakkında daha fazla bilgi için Erişim Değiştiricileri konusuna bakın.
Sanal ve geçersiz kılma yöntemleri
Hem Java hem de C#, ilgili nesneleri aynı şekilde ele alma özelliği olan çok biçimliliği destekler. Her iki dilde de, türetilmiş sınıf nesnesine başvurmak için bir temel sınıf başvurusu kullanabilirsiniz ve türetilmiş bir sınıfın yöntemleri, temel sınıflarının yöntemlerini geçersiz kılabilir. Her iki dil de, türetilmiş bir sınıftaki bir yöntemle değiştirilecek şekilde tasarlanmış bir temel sınıftaki bir yöntem olan sanal yöntem kavramına sahiptir.
Java gibi C# da sınıfları ve yöntemleri destekler abstract
.
Ancak, sanal yöntemleri bildirme ve geçersiz kılma yöntemlerinizde Java ile C# arasında bazı farklar vardır:
C# dilinde yöntemler varsayılan olarak sanal değildir. Üst sınıflar, anahtar sözcüğü kullanılarak hangi yöntemlerin geçersiz kılınacağı açıkça
virtual
etiketlenmelidir. Buna karşılık, Java'daki tüm yöntemler varsayılan olarak sanal yöntemlerdir.C# dilinde bir yöntemin geçersiz kılınmasını önlemek için anahtar sözcüğünü
virtual
devre dışı bırakmanız yeterlidir. Buna karşılık Java, bir yöntemi "geçersiz kılmaya izin verilmiyor" ile işaretlemek için anahtar sözcüğünü kullanırfinal
.C# türetilmiş sınıfları, sanal bir temel sınıf yönteminin geçersiz kılındığını açıkça belirtmek için anahtar sözcüğünü kullanmalıdır
override
.
C#'nin polimorfizm desteği hakkında daha fazla bilgi için Polimorfizm konusuna bakın.
Lambda ifadeleri
C# kapatmaları oluşturmayı mümkün kılar: satır içi, içine alındıkları yöntemin durumuna erişebilen anonim yöntemler. Lambda ifadelerini kullanarak, Java'da daha fazla kod satırıyla uygulamış olabileceğiniz işlevselliği uygulamak için daha az kod satırı yazabilirsiniz.
Lambda ifadeleri, Java'da olduğu gibi tek seferlik kullanımlı veya anonim bir sınıf oluşturma işlemine dahil olan ek töreni atlamanızı mümkün hale getirir. Bunun yerine, yöntem kodunuzun iş mantığını satır içine yazabilirsiniz. Ayrıca lambdaların çevresindeki yöntemdeki değişkenlere erişimi olduğundan, yöntem kodunuz için durum geçirmek için uzun bir parametre listesi oluşturmanız gerekmez.
C# dilinde lambda ifadeleri burada gösterildiği gibi işleçle =>
oluşturulur:
(arg1, arg2, ...) => {
// implementation code
};
Xamarin.Android'de lambda ifadeleri genellikle olay işleyicilerini tanımlamak için kullanılır. Örneğin:
button.Click += (sender, args) => {
clickCount += 1; // access variable in surrounding code
button.Text = string.Format ("Clicked {0} times.", clickCount);
};
Bu örnekte lambda ifade kodu (küme ayraçları içindeki kod) bir tıklama sayısını artırır ve tıklama sayısını görüntülemek için metni güncelleştirir button
. Bu lambda ifadesi, düğmeye her dokunulduğunda button
çağrılacak bir tıklama olayı işleyicisi olarak nesneye kaydedilir. (Olay işleyicileri aşağıda daha ayrıntılı olarak açıklanmıştır.) Bu basit örnekte sender
ve args
parametreleri lambda ifade kodu tarafından kullanılmaz, ancak olay kaydı için yöntem imzası gereksinimlerini karşılamak için lambda ifadesinde gereklidir. Arka planda, C# derleyicisi lambda ifadesini her düğme tıklama olayı gerçekleştiğinde çağrılan anonim bir yönteme çevirir.
C# ve lambda ifadeleri hakkında daha fazla bilgi için Lambda İfadeleri konusuna bakın.
Olay işleme
Olay, nesneye ilginç bir şey olduğunda bir nesnenin kayıtlı aboneleri bilgilendirmesi için bir yoldur. Abonenin genellikle geri çağırma yöntemi içeren bir Listener
arabirim uyguladığı Java'dan farklı olarak, C# temsilciler aracılığıyla olay işleme için dil düzeyinde destek sağlar. Temsilci, nesne odaklı tür güvenli işlev işaretçisi gibidir; nesne başvurularını ve yöntem belirtecini kapsüller. İstemci nesnesi bir olaya abone olmak isterse, bir temsilci oluşturur ve temsilciyi bildirim nesnesine geçirir.
Olay gerçekleştiğinde, bildirim nesnesi temsilci nesnesi tarafından temsil edilen yöntemi çağırarak abone olan istemci nesnesine olayı bildirir. C# dilinde olay işleyicileri temelde temsilciler aracılığıyla çağrılan yöntemlerden başka bir şey değildir.
Temsilciler hakkında daha fazla bilgi için Temsilciler konusuna bakın.
C# dilinde olaylar çok noktaya yayındır; başka bir ifadeyle, bir olay gerçekleştiğinde birden fazla dinleyiciye bildirilebilir. Java ile C# olay kaydı arasındaki bozulma farkları göz önünde bulundurduğunda bu fark gözlenir. Java'da, olay bildirimlerine kaydolmak için ararsınız SetXXXListener
; C# dilinde, temsilcinizi olay dinleyicileri listesine "ekleyerek" olay bildirimlerine kaydolmak için işlecini kullanırsınız +=
.
Java'da kaydı silmek için çağrısı SetXXXListener
yaparken C# dilinde ise temsilcinizi dinleyici listesinden "çıkarmak" için öğesini kullanırsınız -=
.
Xamarin.Android'de olaylar genellikle kullanıcı kullanıcı arabirimi denetimine bir şey yaptığı zaman nesneleri bilgilendirmek için kullanılır. Normalde, kullanıcı arabirimi denetiminin anahtar sözcüğü kullanılarak event
tanımlanan üyeleri olur; bu kullanıcı arabirimi denetiminden olaylara abone olmak için temsilcilerinizi bu üyelere eklersiniz.
Bir olaya abone olmak için:
Olay gerçekleştiğinde çağrılmasını istediğiniz yönteme başvuran bir temsilci nesnesi oluşturun.
+=
Abone olduğunuz olaya temsilcinizi eklemek için işlecini kullanın.
Aşağıdaki örnek, düğme tıklamalarına abone olmak için bir temsilciyi (anahtar sözcüğün delegate
açıkça kullanımıyla) tanımlar.
Bu düğme tıklama işleyicisi yeni bir etkinlik başlatır:
startActivityButton.Click += delegate {
Intent intent = new Intent (this, typeof (MyActivity));
StartActivity (intent);
};
Ancak olaylara kaydolmak için bir lambda ifadesi de kullanabilir ve anahtar sözcüğünü tamamen atlayabilirsiniz delegate
. Örneğin:
startActivityButton.Click += (sender, e) => {
Intent intent = new Intent (this, typeof (MyActivity));
StartActivity (intent);
};
Bu örnekte, nesnenin startActivityButton
belirli bir yöntem imzasıyla temsilci bekleyen bir olayı vardır: gönderen ve olay bağımsız değişkenlerini kabul eden ve void döndüren bir olay. Ancak, böyle bir temsilciyi veya yöntemini açıkça tanımlamak için sorunlara girmek istemediğimiz için ile yönteminin (sender, e)
imzasını bildirir ve olay işleyicisinin gövdesini uygulamak için bir lambda ifadesi kullanırız.
ve e
parametrelerini kullanmasak sender
bile bu parametre listesini bildirmemiz gerekir.
Bir temsilcinin aboneliğini kaldırabileceğinizi (işleç aracılığıyla -=
) unutmayın, ancak lambda ifadesinin aboneliğini kaldıramazsınız; bunu yapmaya çalışmak bellek sızıntılarına neden olabilir. Olay kaydının lambda biçimini yalnızca işleyiciniz olay aboneliğini kaldırmadığında kullanın.
Genellikle, lambda ifadeleri Xamarin.Android kodunda olay işleyicilerini bildirmek için kullanılır. Olay işleyicilerini bildirmenin bu kısa yolu ilk başta şifreli görünebilir, ancak kod yazarken ve okurken çok fazla zaman kazandırır. Artan aşinalıkla, bu düzeni tanımaya alışmış olursunuz (sıklıkla Xamarin.Android kodunda gerçekleşir) ve uygulamanızın iş mantığını düşünmeye daha fazla zaman harcarsınız ve söz dizimi ek yüküyle daha az zaman harcarsınız.
Zaman uyumsuz programlama
Zaman uyumsuz programlama , uygulamanızın genel yanıt hızını artırmanın bir yoludur. Zaman uyumsuz programlama özellikleri, uygulamanızın bir bölümü uzun bir işlem tarafından engellenirken uygulama kodunuzun geri kalanının çalışmaya devam etmelerini mümkün hale getirir. Web'e erişme, görüntüleri işleme ve okuma/yazma dosyaları, zaman uyumsuz olarak yazılmazsa uygulamanın tamamının donmasıyla sonuçlanabilecek işlemlere örnek olarak verilebilir.
C#, ve await
anahtar sözcükleri aracılığıyla async
zaman uyumsuz programlama için dil düzeyinde destek içerir. Bu dil özellikleri, uygulamanızın ana iş parçacığını engellemeden uzun süre çalışan görevler gerçekleştiren kod yazmayı çok kolaylaştırır. Kısaca, yöntemdeki async
kodun zaman uyumsuz olarak çalıştırıldığını ve çağıranın iş parçacığını engellemediğini belirtmek için bir yöntemde anahtar sözcüğünü kullanırsınız. ile async
işaretlenmiş yöntemleri çağırırken anahtar sözcüğünü await
kullanırsınız. Derleyici, yöntemini yürütme işleminin bir arka plan iş parçacığına taşınacağı nokta (çağırana bir görev döndürülür) olarak yorumlar await
. Bu görev tamamlandığında, kodun yürütülmesi çağıranın iş parçacığında kodunuzun await
noktasında sürdürülür ve çağrının async
sonuçları döndürülür. Kural gereği, zaman uyumsuz olarak Async
çalışan yöntemler adlarına son eklenmiştir.
Xamarin.Android uygulamalarında async
ve await
genellikle kullanıcı girişlerine yanıt verebilmesi için (İptal düğmesine dokunma gibi) kullanıcı iş parçacığını serbest bırakırken arka plan görevinde uzun süre çalışan bir işlem gerçekleşir.
Aşağıdaki örnekte, düğme tıklama olay işleyicisi zaman uyumsuz bir işlemin web'den görüntü indirmesine neden olur:
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 ...
Bu örnekte, kullanıcı denetime downloadButton
tıkladığında olay işleyicisi, downloadAsync
belirtilen URL'den görüntü getirmek için bir nesne ve Uri
nesne oluştururWebClient
. Ardından, görüntüyü almak için nesnenin WebClient
DownloadDataTaskAsync
yöntemini bu URL ile çağırır.
yöntem bildiriminin downloadAsync
, zaman uyumsuz olarak çalıştırılacağını ve bir görev döndüreceğini belirtmek için anahtar sözcüğü tarafından async
önceden belirtildiğine dikkat edin. Ayrıca çağrısının DownloadDataTaskAsync
önce anahtar sözcüğünü aldığına await
dikkat edin. Uygulama, tamamlanana ve dönene kadar DownloadDataTaskAsync
olay işleyicisinin yürütülmesini (göründüğü noktadan await
başlayarak) bir arka plan iş parçacığına taşır.
Bu arada, uygulamanın kullanıcı arabirimi iş parçacığı yine de diğer denetimler için kullanıcı girişine yanıt verebilir ve olay işleyicilerini tetikleyebilir. Tamamlandığında DownloadDataTaskAsync
(birkaç saniye sürebilir), yürütme devam eder bytes
ve değişkenin çağrısının sonucu olarak DownloadDataTaskAsync
ayarlandığı ve olay işleyici kodunun geri kalanında çağıranın (UI) iş parçacığında indirilen görüntü görüntülenir.
C# ile ilgili bir giriş için async
/await
Async ve Await ile Zaman Uyumsuz Programlama konusuna bakın.
Zaman uyumsuz programlama özelliklerine yönelik Xamarin desteği hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Desteğe Genel Bakış.
Anahtar sözcük farklılıkları
Java'da kullanılan birçok dil anahtar sözcüğü de C# dilinde kullanılır. Bu tabloda listelendiği gibi C# dilinde eşdeğer ancak farklı adlandırılmış bir eşdeğeri olan bir dizi Java anahtar sözcüğü de vardır:
Java | C# | Açıklama |
---|---|---|
boolean |
bool | True ve false boole değerlerini bildirmek için kullanılır. |
extends |
: |
Devralınacak sınıfın ve arabirimlerin başında yer alır. |
implements |
: |
Devralınacak sınıfın ve arabirimlerin başında yer alır. |
import |
using | Ad alanı diğer adı oluşturmak için de kullanılan bir ad alanından türleri içeri aktarır. |
final |
sealed | Sınıf türetmesini engeller; türetilmiş sınıflarda yöntemlerin ve özelliklerin geçersiz kılınmasını engeller. |
instanceof |
is | Bir nesnenin belirli bir türle uyumlu olup olmadığını değerlendirir. |
native |
extern | Harici olarak uygulanan bir yöntem bildirir. |
package |
namespace | İlgili bir nesne kümesi için bir kapsam bildirir. |
T... |
params T | Değişken sayıda bağımsız değişken alan bir yöntem parametresi belirtir. |
super |
temel | Türetilmiş bir sınıfın içinden üst sınıfın üyelerine erişmek için kullanılır. |
synchronized |
lock | Kodun kritik bir bölümünü kilit alma ve serbest bırakma ile sarmalar. |
Ayrıca, C# için benzersiz olan ve Android'de kullanılan Java'da karşılığı olmayan birçok anahtar sözcük vardır. Xamarin.Android kodu genellikle aşağıdaki C# anahtar sözcüklerini kullanır (bu tablo, Xamarin.Android örnek kodunu okurken başvurmak için yararlıdır.
C# | Açıklama |
---|---|
as | Uyumlu başvuru türleri veya null atanabilir türler arasında dönüştürmeler gerçekleştirir. |
async | Bir yöntemin veya lambda ifadesinin zaman uyumsuz olduğunu belirtir. |
await | Görev tamamlanana kadar bir yöntemin yürütülmesini askıya alır. |
byte | İşaretsiz 8 bit tamsayı türü. |
delegate | Bir yöntemi veya anonim yöntemi kapsüllemek için kullanılır. |
enum | Adlandırılmış sabitler kümesi olan bir sabit listesi bildirir. |
event | Yayımcı sınıfında bir olay bildirir. |
Sabit | Bir değişkenin yeniden yerleştirilmesini engeller. |
get |
Bir özelliğin değerini alan bir erişimci yöntemini tanımlar. |
içinde | Bir parametrenin genel arabirimde daha az türetilmiş bir türü kabul etmelerini sağlar. |
object | .NET framework'teki Nesne türü için bir diğer ad. |
out | Parametre değiştirici veya genel tür parametre bildirimi. |
override | Devralınan üyenin uygulamasını genişletir veya değiştirir. |
kısmi | Bir tanımı birden çok dosyaya bölünecek şekilde bildirir veya bir yöntem tanımını uygulamasından ayırır. |
readonly | Bir sınıf üyesinin yalnızca bildirim zamanında veya sınıf oluşturucu tarafından atanabileceğini bildirir. |
ref | Bir bağımsız değişkenin değer yerine başvuruyla geçirilmesine neden olur. |
set | Bir özelliğin değerini ayarlayan bir erişimci yöntemini tanımlar. |
string | .NET framework'teki Dize türü için diğer ad. |
struct | bir grup ilgili değişkeni kapsülleyen bir değer türü. |
typeof | Bir nesnenin türünü alır. |
var | Örtük olarak türü belirlenmiş bir yerel değişken bildirir. |
value | İstemci kodunun bir özelliğe atamak istediği değere başvurur. |
virtual | Bir yöntemin türetilmiş bir sınıfta geçersiz kılınmasına izin verir. |
Mevcut java koduyla birlikte çalışma
C# dosyasına dönüştürmek istemediğiniz mevcut Java işlevlerine sahipseniz Xamarin.Android uygulamalarında mevcut Java kitaplıklarınızı iki teknikle yeniden kullanabilirsiniz:
Java Bağlamaları Kitaplığı oluşturma – Bu yaklaşımı kullanarak Java türleri çevresinde C# sarmalayıcıları oluşturmak için Xamarin araçlarını kullanırsınız. Bu sarmalayıcılar bağlama olarak adlandırılır. Sonuç olarak, Xamarin.Android uygulamanız bu sarmalayıcıları çağırarak .jar dosyanızı kullanabilir.
Java Yerel Arabirimi – Java Yerel Arabirimi (JNI), C# uygulamalarının Java koduyla çağrılmalarını veya çağrılmalarını mümkün kılan bir çerçevedir.
Bu teknikler hakkında daha fazla bilgi için bkz . Java Tümleştirmeye Genel Bakış.
Daha fazla bilgi
MSDN C# Programlama Kılavuzu, C# programlama dilini öğrenmeye başlamanın harika bir yoludur ve belirli C# dil özelliklerini aramak için C# Başvurusu'nu kullanabilirsiniz.
Java bilgisi en az Java dilini bilmek kadar Java sınıf kitaplıklarına aşinalık konusunda olduğu gibi, C# ile ilgili pratik bilgi de .NET çerçevesi hakkında biraz bilgi gerektirir. Java Geliştiricileri için Microsoft'un C# ve .NET Framework'e Geçişi öğrenme paketi, Java perspektifinden .NET çerçevesi hakkında daha fazla bilgi edinmek için iyi bir yoldur (C# hakkında daha ayrıntılı bilgi edinirken).
C# dilindeki ilk Xamarin.Android projenizi işlemeye hazır olduğunuzda, Hello, Android serimiz ilk Xamarin.Android uygulamanızı oluşturmanıza ve Xamarin ile Android uygulaması geliştirmenin temellerini daha da geliştirmenize yardımcı olabilir.
Özet
Bu makale, Java geliştiricisi açısından Xamarin.Android C# programlama ortamına giriş niteliğindedir. C# ile Java arasındaki benzerliklere işaret ederken pratik farklarını da açıkladı. Derlemeleri ve ad alanlarını kullanıma sundu, dış türleri içeri aktarmayı açıkladı ve erişim değiştiricileri, genel türler, sınıf türetme, temel sınıf yöntemlerini çağırma, yöntemi geçersiz kılma ve olay işleme farklılıklarına genel bir bakış sağladı. Java'da bulunmayan özellikler, zaman uyumsuz programlama, async
/await
lambdalar, C# temsilcileri ve C# olay işleme sistemi gibi C# özellikleri kullanıma sunulmuştur. Burada önemli C# anahtar sözcüklerinden oluşan tablolar yer aldı, mevcut Java kitaplıklarıyla nasıl birlikte çalışılır açıklandı ve daha fazla çalışma için ilgili belgelere bağlantılar sağlandı.