Sdílet prostřednictvím


Xamarin pro vývojáře v jazyce Java

Pokud jste vývojář v Jazyce Java, jste na cestě využít své dovednosti a stávající kód na platformě Xamarin a současně využívat výhody opětovného použití kódu jazyka C#. Zjistíte, že syntaxe jazyka C# je velmi podobná syntaxi Jazyka Java a že oba jazyky poskytují velmi podobné funkce. Kromě toho budete objevovat funkce jedinečné pro jazyk C#, které vám usnadní život ve vývoji.

Přehled

Tento článek obsahuje úvod do programování v jazyce C# pro vývojáře v Jazyce Java, který se zaměřuje především na funkce jazyka C#, se kterými se setkáte při vývoji aplikací Xamarin.Android. Tento článek také vysvětluje, jak se tyto funkce liší od jejich protějšků v Javě, a představuje důležité funkce jazyka C# (relevantní pro Xamarin.Android), které nejsou dostupné v Javě. Odkazy na další referenční materiály jsou zahrnuty, takže tento článek můžete použít jako bod "jumping off" pro další studium jazyka C# a .NET.

Pokud jste obeznámeni s Javou, budete mít okamžitě doma syntaxi jazyka C#. Syntaxe jazyka C# je velmi podobná syntaxi Javy – jazyk C# je "složená závorka", jako je Java, C a C++. Syntaxe jazyka C# se v mnoha ohledech čte jako nadmnožina syntaxe Jazyka Java, ale s několika přejmenovanými a přidanými klíčovými slovy.

Mnoho klíčových charakteristik Jazyka Java najdete v jazyce C#:

  • Programování orientované na objekty založené na třídách

  • Silné psaní

  • Podpora rozhraní

  • Obecné typy

  • Uvolnění paměti

  • Kompilace modulu runtime

Jazyk Java i C# se kompilují do zprostředkujícího jazyka, který běží ve spravovaném spouštěcím prostředí. C# i Java jsou staticky napsané a oba jazyky považují řetězce za neměnné typy. Oba jazyky používají hierarchii jedné kořenové třídy. Stejně jako Java jazyk C# podporuje pouze jedinou dědičnost a neumožňuje globální metody. V obouch new Oba jazyky poskytují formální podporu zpracování výjimek s sémantikou try/catch . Obě poskytují podporu správy vláken a synchronizace.

Mezi Javou a C# ale existuje mnoho rozdílů. Příklad:

  • V Javě můžete předávat parametry pouze podle hodnoty, zatímco v jazyce C# můžete předávat odkazy i podle hodnoty. (Jazyk C# poskytuje ref klíčová out slova pro předávání parametrů odkazem; v Javě neexistuje žádný ekvivalent).

  • Java nepodporuje direktivy preprocesoru, jako je #define.

  • Java nepodporuje celočíselné typy bez znaménka, zatímco jazyk C# poskytuje celočíselné typy bez znaménka, například ulong, uintushort a byte.

  • Java nepodporuje přetížení operátoru; v jazyce C# můžete přetížit operátory a převody.

  • V příkazu Java switch může kód projít do další části přepínače, ale na konci každého switch oddílu jazyka C# musí ukončit přepínač (konec každého oddílu musí být zavřený příkazem break ).

  • V Javě zadáte výjimky vyvolané metodou s throws klíčovým slovem, ale jazyk C# nemá žádný koncept kontrolovaných výjimek – throws klíčové slovo se v jazyce C# nepodporuje.

  • Jazyk C# podporuje jazykově integrovaný dotaz (LINQ), který umožňuje používat vyhrazená slova fromselecta where psát dotazy na kolekce způsobem, který se podobá databázovým dotazům.

Samozřejmě existuje mnoho dalších rozdílů mezi jazykem C# a Javou, než je popsáno v tomto článku. Jazyk Java i C# se také nadále vyvíjejí (například Java 8, která ještě není v sadě nástrojů pro Android, podporuje výrazy lambda ve stylu jazyka C#), takže se tyto rozdíly časem změní. Tady jsou uvedeny pouze nejdůležitější rozdíly, na které vývojáři v Javě noví v Xamarin.Androidu narazili.

  • Přechod z Javy na vývoj v jazyce C# představuje úvod k základním rozdílům mezi jazykem C# a Javou.

  • Objektově orientované programovací funkce popisuje nejdůležitější objektově orientované rozdíly mezi těmito dvěma jazyky.

  • Rozdíly klíčových slov poskytují tabulku užitečných ekvivalentů klíčových slov, klíčových slov jen pro jazyk C#a odkazy na definice klíčových slov jazyka C#.

Jazyk C# přináší do Xamarin.Androidu mnoho klíčových funkcí, které nejsou momentálně snadno dostupné vývojářům v Javě na Androidu. Tyto funkce vám můžou pomoct psát lepší kód za kratší dobu:

  • Vlastnosti – Se systémem vlastností jazyka C# můžete bezpečně a přímo přistupovat k proměnným členů bez nutnosti psát metody setter a getter.

  • Lambda Expressions – V jazyce C# můžete použít anonymní metody (označované také jako lambda) k vyjádření vašich funkcí stručněji a efektivněji. Můžete se vyhnout režii při psaní jednorázových objektů a můžete předat místní stav metodě, aniž byste museli přidávat parametry.

  • Zpracování událostí – C# poskytuje podporu programování na úrovni jazyka pro programování řízené událostmi, kde se objekt může zaregistrovat, aby byl upozorněn, když dojde k události zájmu. Klíčové event slovo definuje mechanismus vysílání vícesměrového vysílání, který může třída vydavatele použít k upozorňovat odběratele událostí.

  • Asynchronní programování – asynchronní programovací funkce jazyka C# (async/await) udržují aplikace responzivní. Podpora této funkce na úrovni jazyka usnadňuje implementaci asynchronního programování a méně náchylných k chybám.

A konečně Xamarin umožňuje využívat existující prostředky Javy prostřednictvím technologie známé jako vazby. Pomocí generátorů automatických vazeb Xamarinu můžete z jazyka C# volat stávající kód, architektury a knihovny Jazyka Java. Uděláte to tak, že jednoduše vytvoříte statickou knihovnu v Javě a zpřístupníte ji v jazyce C# prostřednictvím vazby.

Poznámka:

Programování pro Android používá konkrétní verzi jazyka Java, která podporuje všechny funkce Javy 7 a podmnožinu Javy 8.

Některé funkce uvedené na této stránce (například var klíčové slovo v jazyce C#) jsou dostupné v novějších verzích Javy (např. var v Javě 10), ale vývojářům pro Android stále nejsou k dispozici.

Přechod z Javy na vývoj v jazyce C#

Následující části popisují základní rozdíly mezi jazykem C# a Javou. Další část popisuje objektově orientované rozdíly mezi těmito jazyky.

Knihovny vs. sestavení

Java obvykle balíčky související třídy v .jar soubory. V jazyce C# a .NET jsou však opakovaně použitelné bity předkompilovaného kódu zabalené do sestavení, která jsou obvykle zabalena jako soubory .dll . Sestavení je jednotka nasazení kódu C#/.NET a každé sestavení je obvykle přidružené k projektu jazyka C#. Sestavení obsahují zprostředkující kód (IL), který je za běhu zkompilován za běhu.

Další informace o sestaveních naleznete v tématu Sestavení a globální mezipaměť sestavení .

Balíčky vs. obory názvů

Jazyk C# pomocí klíčového namespace slova seskupí související typy. Je to podobné klíčovému slovu package Java. Aplikace Xamarin.Android se obvykle nachází v oboru názvů vytvořeném pro danou aplikaci. Například následující kód jazyka C# deklaruje obálku WeatherApp oboru názvů pro aplikaci pro hlášení počasí:

namespace WeatherApp
{
    ...

Import typů

Když použijete typy definované v externích oborech názvů, importujete tyto typy pomocí using příkazu (který je velmi podobný příkazu Java import ). V Javě můžete importovat jeden typ s příkazem, jako je následující:

import javax.swing.JButton

Celý balíček Java můžete importovat pomocí tohoto příkazu:

import javax.swing.*

Příkaz jazyka C# using funguje velmi podobným způsobem, ale umožňuje importovat celý balíček bez zadání zástupných znaků. Často se například zobrazí řada příkazů na začátku zdrojových using souborů Xamarin.Android, jak je vidět v tomto příkladu:

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;

Tyto příkazy importují funkce z Systemoborů názvů , Android.App, Android.Contentatd.

Obecné typy

Jazyk Java i C# podporují obecné typy, což jsou zástupné symboly, které umožňují připojit různé typy v době kompilace. Obecné typy ale v jazyce C# fungují trochu jinak. Vymazání typu v Javě zpřístupňuje informace o typu pouze v době kompilace, ale ne za běhu. Modul CLR (Common Language Runtime) .NET naproti tomu poskytuje explicitní podporu obecných typů, což znamená, že jazyk C# má přístup k informacím o typech za běhu. V každodenním vývoji Xamarin.Android není důležitost tohoto rozdílu často zjevná, ale pokud používáte reflexi, budete na této funkci záviset na přístupu k informacím o typu za běhu.

V Xamarin.Androidu se často zobrazí obecná metoda FindViewById použitá k získání odkazu na ovládací prvek rozložení. Tato metoda přijímá parametr obecného typu, který určuje typ ovládacího prvku, který se má vyhledat. Příklad:

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

V tomto příkladu TextView kódu získá odkaz na ovládací prvek definovaný FindViewById v rozložení jako Popisek a vrátí ho TextView jako typ.

Další informace o obecných souborech najdete v tématu Obecné typy . Všimněte si, že v Xamarin.Androidu platí určitá omezení pro obecné třídy jazyka C#; Další informace naleznete v tématu Omezení.

Objektově orientované programovací funkce

Java i C# používají velmi podobné objektově orientované programovací idiomy:

  • Všechny třídy jsou nakonec odvozeny z jednoho kořenového objektu – všechny objekty Java jsou odvozeny od java.lang.Object, zatímco všechny objekty jazyka C# jsou odvozeny od System.Object.

  • Instance tříd jsou odkazové typy.

  • Při přístupu k vlastnostem a metodám instance použijete operátor ".".

  • Všechny instance třídy jsou vytvořeny v haldě prostřednictvím operátoru new .

  • Vzhledem k tomu, že oba jazyky používají uvolňování paměti, neexistuje způsob, jak explicitně uvolnit nepoužívané objekty (tj. neexistuje delete klíčové slovo, protože existuje v jazyce C++).

  • Třídy můžete rozšířit prostřednictvím dědičnosti a oba jazyky umožňují pouze jednu základní třídu na typ.

  • Můžete definovat rozhraní a třída může dědit z více definic rozhraní (tj. implementovat).

Existují však také některé důležité rozdíly:

  • Java má dvě výkonné funkce, které jazyk C# nepodporuje: anonymní třídy a vnitřní třídy. (Jazyk C# ale umožňuje vnořování definic tříd – vnořené třídy jazyka C#jsou jako statické vnořené třídy Jazyka Java.)

  • Jazyk C# podporuje typy struktur ve stylu jazyka C (struct), zatímco Java ne.

  • V jazyce C# můžete implementovat definici třídy v samostatných zdrojových souborech pomocí klíčového partial slova.

  • Rozhraní jazyka C# nemohou deklarovat pole.

  • Jazyk C# používá syntaxi destruktoru ve stylu C++k vyjádření finalizátorů. Syntaxe se liší od metody Javy finalize , ale sémantika je téměř stejná. (Všimněte si, že v jazyce C# destruktory automaticky volají destruktor základní třídy – na rozdíl od Javy, kde se používá explicitní volání super.finalize .)

Dědičnost tříd

Pokud chcete rozšířit třídu v Javě, použijte extends klíčové slovo. Pokud chcete rozšířit třídu v jazyce C#, použijte dvojtečku (:) k označení odvození. Například v aplikacích Xamarin.Android se často zobrazí odvození tříd, které se podobají následujícímu fragmentu kódu:

public class MainActivity : Activity
{
    ...

V tomto příkladu MainActivityActivity dědí z třídy.

Pokud chcete deklarovat podporu rozhraní v Javě, použijte implements klíčové slovo. V jazyce C# však jednoduše přidáte názvy rozhraní do seznamu tříd, ze které se mají dědit, jak je znázorněno v tomto fragmentu kódu:

public class SensorsActivity : Activity, ISensorEventListener
{
    ...

V tomto příkladu SensorsActivity dědí Activity a implementuje funkce deklarované v ISensorEventListener rozhraní. Všimněte si, že seznam rozhraní musí pocházet po základní třídě (nebo se zobrazí chyba v době kompilace). Podle konvence se názvy rozhraní jazyka C# předkládají velkým písmenem "I"; to umožňuje určit, které třídy jsou rozhraní bez nutnosti klíčového implements slova.

Pokud chcete zabránit tomu, aby třída byla dále podtříděna v jazyce C#, před název třídy před názvem sealed třídy v Javě předejdete názvem finaltřídy .

Další informace o definicích tříd jazyka C# najdete v tématech Třídy a dědičnost .

Vlastnosti

V Javě se často používají metody mutatoru (setter) a metody inspektoru (getters) k řízení toho, jak se změny provádějí u členů třídy a zároveň skrývají a chrání tyto členy před vnějším kódem. Například třída Androidu TextView poskytuje getText a setText metody. Jazyk C# poskytuje podobný, ale více přímý mechanismus, který se označuje jako vlastnosti. Uživatelé třídy jazyka C# mají přístup k vlastnosti stejným způsobem jako k poli, ale každý přístup ve skutečnosti vede k volání metody, která je pro volajícího transparentní. Tato metoda "under the cover" může implementovat vedlejší účinky, jako je nastavení jiných hodnot, provádění převodů nebo změna stavu objektu.

Vlastnosti se často používají pro přístup k členům objektu uživatelského rozhraní (uživatelského rozhraní) a jejich úpravě. Příklad:

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

V tomto příkladu jsou hodnoty šířky a výšky načteny z objektu rulerView přístupem k jeho MeasuredWidth a MeasuredHeight vlastnostem. Při čtení těchto vlastností se hodnoty z přidružených (ale skrytých) hodnot polí načtou na pozadí a vrátí se volajícímu. Objekt rulerView může ukládat hodnoty šířky a výšky v jedné měrné jednotce (například pixely) a tyto hodnoty převést při přístupu na jinou měrnou jednotku (například milimetry).MeasuredWidthMeasuredHeight

Objekt rulerView má také volána DrawingCacheEnabled vlastnost – ukázkový kód nastaví tuto vlastnost tak, aby true povolovala mezipaměť výkresu v rulerView. Na pozadí se aktualizuje přidružené skryté pole s novou hodnotou a případně se upraví i další aspekty rulerView stavu. Například pokud DrawingCacheEnabled je nastavena na false, rulerView může také vymazat všechny informace o mezipaměti výkresu, které jsou již v objektu kumulovány.

Přístup k vlastnostem může být jen pro čtení a zápis, jen pro čtení nebo jen pro zápis. Pro čtení a zápis můžete také použít různé modifikátory přístupu. Můžete například definovat vlastnost, která má veřejný přístup pro čtení, ale privátní přístup k zápisu.

Další informace o vlastnostech jazyka C# naleznete v tématu Vlastnosti .

Volání metod základní třídy

Chcete-li volat konstruktor základní třídy v jazyce C#, použijete dvojtečku (:) následovanou klíčovým slovem base a seznamem inicializátorů. Toto base volání konstruktoru se umístí hned za seznam parametrů odvozeného konstruktoru. Konstruktor základní třídy je volána při vstupu do odvozeného konstruktoru; kompilátor vloží volání základního konstruktoru na začátek těla metody. Následující fragment kódu znázorňuje základní konstruktor volaný z odvozeného konstruktoru v aplikaci Xamarin.Android:

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

V tomto příkladu PictureLayout je třída odvozena z ViewGroup třídy. Konstruktor PictureLayout zobrazený v tomto příkladu context přijímá argument a předává ho ViewGroup konstruktoru base(context) prostřednictvím volání.

K volání metody základní třídy v jazyce C# použijte base klíčové slovo. Aplikace Xamarin.Android například často volaly základní metody, jak je znázorněno tady:

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

V tomto případě OnCreate metoda definovaná odvozenou třídou (MainActivity) volá OnCreate metodu základní třídy (Activity).

Modifikátory přístupu

Java i C# podporují publicmodifikátory , privatea protected přístup. Jazyk C# však podporuje dva další modifikátory přístupu:

  • internal – Člen třídy je přístupný pouze v rámci aktuálního sestavení.

  • protected internal – Člen třídy je přístupný v rámci definování sestavení, definování třídy a odvozené třídy (odvozené třídy uvnitř i mimo sestavení mají přístup).

Další informace o modifikátorech přístupu jazyka C# najdete v tématu Modifikátory přístupu.

Virtuální metody a metody přepsání

Jazyk Java i C# podporují polymorfismus, schopnost pracovat se souvisejícími objekty stejným způsobem. V obou jazycích můžete odkazovat na objekt odvozené třídy pomocí odkazu na základní třídu a metody odvozené třídy mohou přepsat metody jeho základních tříd. Oba jazyky mají koncept virtuální metody, metoda v základní třídě, která je navržena tak, aby byla nahrazena metodou v odvozené třídě. Stejně jako Java jazyk C# podporuje abstract třídy a metody.

Mezi Javou a C# ale existují určité rozdíly v tom, jak deklarujete virtuální metody a přepíšete je:

  • V jazyce C# jsou metody ve výchozím nastavení ne virtuální. Nadřazené třídy musí explicitně označovat, které metody mají být přepsány pomocí klíčového virtual slova. Naproti tomu všechny metody v Javě jsou ve výchozím nastavení virtuálními metodami.

  • Chcete-li zabránit přepsání metody v jazyce C#, jednoduše ponechte virtual klíčové slovo. Naproti tomu Java používá final klíčové slovo k označení metody s textem "override is not allowed" (Přepsání není povoleno).

  • Odvozené třídy jazyka C# musí použít override klíčové slovo k explicitní označení, že je přepsána virtuální metoda základní třídy.

Další informace o podpoře polymorfismu v jazyce C# najdete v tématu Polymorfismus .

Výrazy lambda

Jazyk C# umožňuje vytvářet uzavření: vložené a anonymní metody, které mají přístup ke stavu metody, ve které jsou uzavřeny. Pomocí výrazů lambda můžete napsat méně řádků kódu, abyste implementovali stejné funkce, které jste mohli implementovat v Javě s mnoha dalšími řádky kódu.

Výrazy lambda umožňují vynechat nadbytečnou ceremonii, která se týká vytvoření jednorázové třídy nebo anonymní třídy stejně jako v Javě – místo toho můžete jednoduše napsat obchodní logiku kódu metody vloženou do textu. Vzhledem k tomu, že lambda mají přístup k proměnným v okolní metodě, nemusíte vytvářet dlouhý seznam parametrů pro předávání stavu kódu metody.

V jazyce C# se výrazy lambda vytvářejí pomocí operátoru => , jak je znázorněno tady:

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

V Xamarin.Android se výrazy lambda často používají k definování obslužných rutin událostí. Příklad:

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

V tomto příkladu kód výrazu lambda (kód uvnitř složených závorek) zvýší počet kliknutí a aktualizuje button text tak, aby zobrazil počet kliknutí. Tento výraz lambda je registrován u objektu button jako obslužná rutina události kliknutí, která se má volat při každém klepnutí na tlačítko. (Obslužné rutiny událostí jsou vysvětleny podrobněji níže.) V tomto jednoduchém příkladu kód výrazu sender lambda a args parametry nepoužívají, ale ve výrazu lambda se vyžadují, aby splňovaly požadavky na podpis metody pro registraci událostí. Kompilátor jazyka C# přeloží výraz lambda na anonymní metodu, která se volá pokaždé, když dojde k událostem kliknutí na tlačítko.

Další informace o výrazech jazyka C# a lambda najdete v tématu Výrazy lambda.

Zpracování událostí

Událost je způsob, jak objekt upozornit registrované odběratele, když se s tímto objektem stane něco zajímavého. Na rozdíl od Javy, kde odběratel obvykle implementuje Listener rozhraní, které obsahuje metodu zpětného volání, poskytuje jazyk C# podporu pro zpracování událostí prostřednictvím delegátů. Delegát je jako ukazatel funkce s objektově orientovaným typem – zapouzdřuje odkaz na objekt a token metody. Pokud se objekt klienta chce přihlásit k odběru události, vytvoří delegáta a předá delegáta objektu s oznámením. Když dojde k události, upozorňování objekt vyvolá metodu reprezentovanou objektem delegáta, upozorňují na odběr klientského objektu události. V jazyce C# nejsou obslužné rutiny událostí v podstatě nic víc než metody, které jsou vyvolány prostřednictvím delegátů.

Další informace o delegátech najdete v tématu Delegáti .

V jazyce C# jsou události vícesměrové vysílání. To znamená, že když dojde k události, může být upozorňováno více než jeden naslouchací proces. Tento rozdíl se pozoruje, když zvažujete syntaktické rozdíly mezi registrací událostí Java a C#. V Javě voláte SetXXXListener k registraci oznámení událostí. V jazyce C# pomocí operátora += zaregistrujete oznámení událostí tím, že "přidáte" svého delegáta do seznamu naslouchacích procesů událostí. V Javě voláte SetXXXListener zrušení registrace, zatímco v jazyce C# použijete -= možnost "odečíst" delegáta ze seznamu naslouchacích procesů.

V Xamarin.Androidu se události často používají k upozorňování objektů, když uživatel něco udělá s ovládacím prvku uživatelského rozhraní. Za normálních okolností bude mít ovládací prvek uživatelského rozhraní členy definované pomocí klíčového event slova. Delegáty připojíte k těmto členům a přihlásíte se k odběru událostí z tohoto ovládacího prvku uživatelského rozhraní.

Přihlášení k odběru události:

  1. Vytvořte delegovaný objekt, který odkazuje na metodu, kterou chcete vyvolat při výskytu události.

  2. Pomocí operátoru += připojte svého delegáta k události, ke které se přihlašujete k odběru.

Následující příklad definuje delegáta (s explicitním použitím klíčového delegate slova) k přihlášení k odběru kliknutí na tlačítko. Tato obslužná rutina kliknutí na tlačítko spustí novou aktivitu:

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

Výraz lambda ale můžete také použít k registraci událostí a úplně přeskočení klíčového delegate slova. Příklad:

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

V tomto příkladu startActivityButton má objekt událost, která očekává delegáta s určitým podpisem metody: jeden, který přijímá argumenty odesílatele a události a vrací void. Protože ale nechceme přejít na potíže explicitně definovat takový delegát nebo jeho metodu, deklarujeme podpis metody s výrazem (sender, e) lambda k implementaci textu obslužné rutiny události. Všimněte si, že tento seznam parametrů musíme deklarovat, i když nepoužíváme sender parametry.e

Je důležité si uvědomit, že delegáta můžete odhlásit (prostřednictvím operátora -= ), ale nemůžete zrušit odběr výrazu lambda – pokus o to může způsobit nevracení paměti. Formát lambda registrace události použijte pouze v případě, že obslužná rutina neodhlásí odběr události.

Výrazy lambda se obvykle používají k deklaraci obslužných rutin událostí v kódu Xamarin.Android. Tento krátký způsob, jak deklarovat obslužné rutiny událostí, se může zpočátku zdát kryptografický, ale šetří obrovské množství času při psaní a čtení kódu. S rostoucím vědomím se stáváte zvykem rozpoznat tento vzor (který se často vyskytuje v kódu Xamarin.Android) a strávíte více času přemýšlet o obchodní logice vaší aplikace a méně času projít syntaktické režijní režie.

Asynchronní programování

Asynchronní programování je způsob, jak zlepšit celkovou odezvu aplikace. Asynchronní programovací funkce umožňují, aby zbytek kódu aplikace pokračoval v provozu, zatímco některá část aplikace je blokovaná zdlouhavou operací. Přístup k webu, zpracování obrázků a souborů pro čtení a zápis jsou příklady operací, které můžou způsobit, že se celá aplikace zdá, že se zablokuje, pokud není napsaná asynchronně.

Jazyk C# zahrnuje podporu na úrovni jazyka pro asynchronní programování prostřednictvím async klíčových slov a await klíčových slov. Tyto jazykové funkce usnadňují psaní kódu, který provádí dlouhotrvající úlohy bez blokování hlavního vlákna aplikace. Stručně řečeno, pomocí klíčového async slova pro metodu indikuje, že kód v metodě je spustit asynchronně a neblokovat vlákno volajícího. Klíčové slovo použijete await při volání metod, které jsou označeny async. Kompilátor interpretuje await jako bod, ve kterém má být provádění metody přesunuto do vlákna na pozadí (úloha se vrátí volajícímu). Po dokončení této úlohy se provádění kódu obnoví ve vlákně volajícího v await okamžiku v kódu a vrátí výsledky async volání. Podle konvence mají metody, které běží asynchronně Async , příponu jejich názvů.

V aplikacích async Xamarin.Android a await obvykle se používají k uvolnění vlákna uživatelského rozhraní, aby mohl reagovat na vstup uživatele (například klepnutí na tlačítko Zrušit ), zatímco dlouhotrvající operace probíhá v úloze na pozadí.

V následujícím příkladu obslužná rutina události kliknutí na tlačítko způsobí, že asynchronní operace stáhne obrázek z webu:

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 ...

V tomto příkladu když uživatel klikne na downloadButton ovládací prvek, downloadAsync obslužná rutina události vytvoří WebClient objekt a Uri objekt pro načtení obrázku ze specifikované adresy URL. Dále volá metodu objektu WebClientDownloadDataTaskAsync s touto adresou URL pro načtení obrázku.

Všimněte si, že deklarace downloadAsync metody je uvedena klíčovým slovem async , aby indikovala, že se spustí asynchronně a vrátí úlohu. Všimněte si také, že před voláním DownloadDataTaskAsyncawait předchází klíčové slovo. Aplikace přesune spuštění obslužné rutiny události (počínaje místem, kde await se zobrazí) do vlákna na pozadí, dokud DownloadDataTaskAsync se dokončí a vrátí. Mezitím může vlákno uživatelského rozhraní aplikace stále reagovat na vstup uživatele a aktivovat obslužné rutiny událostí pro ostatní ovládací prvky. Po DownloadDataTaskAsync dokončení (což může trvat několik sekund), spuštění obnoví tam, kde bytes je proměnná nastavena na výsledek volání DownloadDataTaskAsynca zbývající část kódu obslužné rutiny události zobrazí stažený obrázek ve vlákně volajícího (UI).

Úvod do async/await jazyka C# najdete v tématu Asynchronní programování s asynchronním programováním a tématem Await. Další informace o podpoře asynchronních programovacích funkcí Xamarinu najdete v tématu Přehled podpory asynchronní.

Rozdíly mezi klíčovými slovy

Mnoho klíčových slov jazyka používaných v Javě se používá také v jazyce C#. Existuje také řada klíčových slov Java, která mají ekvivalentní, ale odlišně pojmenovaný protějšk v jazyce C#, jak je uvedeno v této tabulce:

Java C# Popis
boolean bool Slouží k deklarování logických hodnot true a false.
extends : Předchází třídě a rozhraní, ze které se mají dědit.
implements : Předchází třídě a rozhraní, ze které se mají dědit.
import using Importuje typy z oboru názvů, které se také používají k vytvoření aliasu oboru názvů.
final sealed Zabraňuje odvození třídy; zabraňuje přepsání metod a vlastností v odvozených třídách.
instanceof is Vyhodnotí, zda je objekt kompatibilní s daným typem.
native extern Deklaruje metodu, která je implementována externě.
package namespace Deklaruje obor pro související sadu objektů.
T... parametry T Určuje parametr metody, který přebírá proměnný počet argumentů.
super base Používá se pro přístup k členům nadřazené třídy z odvozené třídy.
synchronized lock Zabalí kritickou část kódu získáním zámku a vydáním.

Existuje také mnoho klíčových slov, která jsou jedinečná pro jazyk C# a nemají žádný protějšek v Javě používané v Androidu. Kód Xamarin.Android často používá následující klíčová slova jazyka C# (tato tabulka je užitečná při čtení vzorového kódu Xamarin.Android.

C# Popis
as Provádí převody mezi kompatibilními odkazovými typy nebo typy s možnou hodnotou null.
async Určuje, že metoda nebo výraz lambda je asynchronní.
await Pozastaví provádění metody, dokud se úloha neskončí.
byte Typ 8bitového celého čísla bez znaménka
delegate Používá se k zapouzdření metody nebo anonymní metody.
enum Deklaruje výčet, sadu pojmenovaných konstant.
event Deklaruje událost ve třídě vydavatele.
Dlouhodobého Zabrání přemístění proměnné.
get Definuje metodu přístupového objektu, která načte hodnotu vlastnosti.
v Umožňuje parametru přijmout méně odvozený typ v obecném rozhraní.
object Alias pro typ objektu v rozhraní .NET Framework.
out Modifikátor parametrů nebo deklarace parametru obecného typu
override Rozšiřuje nebo upravuje implementaci zděděného člena.
partial Deklaruje definici, která se má rozdělit do více souborů, nebo rozdělí definici metody z její implementace.
readonly Deklaruje, že člen třídy lze přiřadit pouze v době deklarace nebo konstruktorem třídy.
ref Způsobí, že argument se předá odkazem, nikoli hodnotou.
set Definuje metodu přístupového objektu, která nastaví hodnotu vlastnosti.
string Alias pro typ String v rozhraní .NET Framework.
struct Typ hodnoty, který zapouzdřuje skupinu souvisejících proměnných.
typeof Získá typ objektu.
var Deklaruje implicitně zatypovanou místní proměnnou.
value Odkazuje na hodnotu, kterou má kód klienta přiřadit k vlastnosti.
virtual Umožňuje přepsání metody v odvozené třídě.

Spolupráce s existujícím kódem Java

Pokud máte existující funkce Jazyka Java, které nechcete převést na jazyk C#, můžete stávající knihovny Java v aplikacích Xamarin.Android znovu použít pomocí dvou technik:

  • Vytvořte knihovnu vazeb Java – pomocí tohoto přístupu použijete nástroje Xamarinu k vygenerování obálky jazyka C# kolem typů Javy. Tyto obálky se nazývají vazby. Aplikace Xamarin.Android proto může soubor .jar použít voláním těchto obálk.

  • Java Native Interface – Java Native Interface (JNI) je architektura, která umožňuje volání nebo volání aplikací jazyka C# kódem Jazyka Java.

Další informace o těchto technikách najdete v tématu Přehled integrace Javy.

Další texty

Průvodce programováním msdn C# je skvělý způsob, jak začít s výukou programovacího jazyka C# a pomocí referenční příručky jazyka C# můžete vyhledat konkrétní funkce jazyka C#.

Stejně jako znalosti Jazyka Java vyžaduje znalost jazyka Java alespoň tolik znalost knihoven tříd Java, jako znalost jazyka Java, praktické znalosti jazyka C# vyžadují znalost rozhraní .NET Framework. Microsoft přechází na C# a rozhraní .NET Framework, pro vývojáře v Javě je dobrým způsobem, jak získat další informace o rozhraní .NET Framework z pohledu Javy (a zároveň získat hlubší znalosti jazyka C#).

Až budete připraveni začít řešit svůj první projekt Xamarin.Android v jazyce C#, naše série Hello, Android vám může pomoct sestavit svou první aplikaci Xamarin.Android a dále porozumět základům vývoje aplikací pro Android pomocí Xamarinu.

Shrnutí

Tento článek poskytl úvod do programovacího prostředí Xamarin.Android C# z pohledu vývojáře v Javě. Zdůraznila podobnosti mezi C# a Javou a vysvětlením jejich praktických rozdílů. Zavedla sestavení a obory názvů, vysvětlila, jak importovat externí typy a poskytla přehled rozdílů v modifikátorech přístupu, obecných typech, odvození tříd, volání metod základní třídy, přepsání metody a zpracování událostí. Zavedl funkce jazyka C#, které nejsou dostupné v Javě, jako jsou vlastnosti, async/await asynchronní programování, lambda, delegáti jazyka C# a systém zpracování událostí jazyka C#. Zahrnovala tabulky důležitých klíčových slov jazyka C#, vysvětlila, jak interoperovat s existujícími knihovnami Java, a poskytla odkazy na související dokumentaci pro další studium.