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
,uint
ushort
abyte
.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éhoswitch
oddílu jazyka C# musí ukončit přepínač (konec každého oddílu musí být zavřený příkazembreak
).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
from
select
awhere
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 System
oborů názvů , Android.App
, Android.Content
atd.
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 odSystem.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 MainActivity
Activity
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 final
tří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).MeasuredWidth
MeasuredHeight
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í public
modifikátory , private
a 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:
Vytvořte delegovaný objekt, který odkazuje na metodu, kterou chcete vyvolat při výskytu události.
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 WebClient
DownloadDataTaskAsync
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 DownloadDataTaskAsync
await
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í DownloadDataTaskAsync
a 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.