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 ve out 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# , uintve ushortbytegibi ulongiş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 her switch bölümün sonu anahtarı sonlandırmalıdır (her bölümün sonu bir break 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üklerini fromselectkullanarak 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.

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.Contentvb. ad alanlarının Systemiş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.Objecttüretilirken, tüm C# nesneleri öğesinden System.Objecttü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 finalgeç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 MeasuredWidthMeasuredHeight (örneğin, milimetre) dönüştürebilir.

rulerView nesnesi de adlı DrawingCacheEnabled bir özelliğe sahiptir; örnek kod, içinde çizim önbelleğini rulerViewetkinleş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 falserulerView 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 ViewGroupbase(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 (MainActivityActivity) yöntemini çağırırOnCreate.

Erişim değiştiricileri

Java ve C# hem , privatehem 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ır final .

  • 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:

  1. Olay gerçekleştiğinde çağrılmasını istediğiniz yönteme başvuran bir temsilci nesnesi oluşturun.

  2. += 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 asynciş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 WebClientDownloadDataTaskAsync 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 DownloadDataTaskAsyncayarlandığı 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 ArabirimiJava 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ı.