Xamarin für Java-EntwicklerXamarin for Java Developers

Wenn Sie ein Java-Entwickler sind, sind Sie auf dem besten Weg, Ihre Fähigkeiten und vorhandenen Code auf der Xamarin-Plattform zu nutzen und gleichzeitig die Vorteile von C# für die Wiederverwendung von Code auszuschöpfen. Sie werden feststellen, dass die C#-Syntax der Java-Syntax sehr ähnlich ist und dass beide Sprachen sehr ähnliche Funktionen bieten. Darüber hinaus werden Sie Features entdecken, die einzigartig in C# sind und Ihnen das Entwicklerleben erleichtern.If you are a Java developer, you are well on your way to leveraging your skills and existing code on the Xamarin platform while reaping the code reuse benefits of C#. You will find that C# syntax is very similar to Java syntax, and that both languages provide very similar features. In addition, you'll discover features unique to C# that will make your development life easier.

ÜbersichtOverview

Dieser Artikel bietet eine Einführung in die C#-Programmierung für Java-Entwickler und konzentriert sich vor allem auf die C#-Sprachfunktionen, die Ihnen bei der Entwicklung von Xamarin.Android-Anwendungen begegnen werden.This article provides an introduction to C# programming for Java developers, focusing primarily on the C# language features that you will encounter while developing Xamarin.Android applications. Außerdem wird in diesem Artikel erläutert, wie sich diese Features von ihren Java-Gegenstücken unterscheiden, und es werden wichtige C#-Features (relevant für Xamarin.Android) vorgestellt, die in Java nicht verfügbar sind.Also, this article explains how these features differ from their Java counterparts, and it introduces important C# features (relevant to Xamarin.Android) that are not available in Java. Links zu weiterem Referenzmaterial sind enthalten, sodass Sie diesen Artikel als „Ausgangspunkt“ für weitere Studien zu C# und .NET verwenden können.Links to additional reference material are included, so you can use this article as a "jumping off" point for further study of C# and .NET.

Wenn Sie mit Java vertraut sind, werden Sie sich in der Syntax von C# sofort zu Hause fühlen.If you are familiar with Java, you will feel instantly at home with the syntax of C#. C#-Syntax ist der Java-Syntax sehr ähnlich – C# ist eine Sprache mit „geschweiften Klammern“ wie Java, C und C++.C# syntax is very similar to Java syntax – C# is a "curly brace" language like Java, C, and C++. In vielerlei Hinsicht liest sich die C#-Syntax wie eine Obermenge der Java-Syntax, aber mit ein paar umbenannten und hinzugefügten Schlüsselwörtern.In many ways, C# syntax reads like a superset of Java syntax, but with a few renamed and added keywords.

Viele Schlüsselmerkmale von Java finden sich in C#:Many key characteristics of Java can be found in C#:

  • Klassenbasierte objektorientierte ProgrammierungClass-based object-oriented programming

  • Starke TypisierungStrong typing

  • Unterstützung für SchnittstellenSupport for interfaces

  • GenericsGenerics

  • Garbage CollectionGarbage collection

  • LaufzeitkompilierungRuntime compilation

Sowohl Java als auch C# werden zu einer Zwischensprache kompiliert, die in einer verwalteten Ausführungsumgebung ausgeführt wird.Both Java and C# are compiled to an intermediate language that is run in a managed execution environment. Sowohl C# als auch Java sind statisch typisiert, und beide Sprachen behandeln Zeichenfolgen als unveränderliche Typen.Both C# and Java are statically-typed, and both languages treat strings as immutable types. Beide Sprachen verwenden eine Klassenhierarchie mit nur einem Stamm.Both languages use a single-rooted class hierarchy. Wie Java unterstützt auch C# nur die einfache Vererbung und erlaubt keine globalen Methoden.Like Java, C# supports only single inheritance and does not allow for global methods. In beiden Sprachen werden Objekte mit dem Schlüsselwort new auf dem Heap erstellt, und für Objekte wird Garbage Collection ausgeführt, wenn sie nicht mehr verwendet werden.In both languages, objects are created on the heap using the new keyword, and objects are garbage-collected when they are no longer used. Beide Sprachen bieten formale Ausnahmebehandlung mit try/catch-Semantik.Both languages provide formal exception handling support with try/catch semantics. Beide bieten Unterstützung für die Verwaltung und Synchronisierung von Threads.Both provide thread management and synchronization support.

Es gibt jedoch auch zahlreiche Unterschiede zwischen Java und C#.However, there are many differences between Java and C#. Beispiel:For example:

  • Java unterstützt keine implizit typisierten lokalen Variablen (C# unterstützt das Schlüsselwort var).Java does not support implicitly-typed local variables (C# supports the var keyword).

  • In Java können Sie Parameter nur als Wert übergeben, während Sie sie in C# sowohl als Verweis als auch als Wert übergeben können.In Java, you can pass parameters only by value, while in C# you can pass by reference as well as by value. (C# stellt die Schlüsselwörter ref und out für die Übergabe von Parametern durch Verweis zur Verfügung. Es gibt kein Äquivalent zu diesen Schlüsselwörtern in Java).(C# provides the ref and out keywords for passing parameters by reference; there is no equivalent to these in Java).

  • Java unterstützt keine Präprozessordirektiven wie #define.Java does not support preprocessor directives like #define.

  • Java unterstützt keine Integertypen ohne Vorzeichen, während C# Integertypen ohne Vorzeichen bereitstellt, z.B. ulong, uint, ushort und byte.Java does not support unsigned integer types, while C# provides unsigned integer types such as ulong, uint, ushort and byte.

  • Java unterstützt keine Operatorüberladung. In C# können Sie Operatoren und Konvertierungen überladen.Java does not support operator overloading; in C# you can overload operators and conversions.

  • In einer Java switch-Anweisung kann Code in den nächsten Switch-Abschnitt fallen, aber in C# muss das Ende jedes switch-Abschnitts den Switch beenden (das Ende jedes Abschnitts muss mit einer break-Anweisung abgeschlossen werden).In a Java switch statement, code can fall through into the next switch section, but in C# the end of every switch section must terminate the switch (the end of each section must close with a break statement).

  • In Java geben Sie die Ausnahmen, die von einer Methode ausgelöst werden, mit dem Schlüsselwort throws an, aber C# hat kein Konzept von geprüften Ausnahmen – das Schlüsselwort throws wird in C# nicht unterstützt.In Java, you specify the exceptions thrown by a method with the throws keyword, but C# has no concept of checked exceptions – the throws keyword is not supported in C#.

  • C# unterstützt LINQ (Language-Integrated Query). Damit können Sie die reservierten Wörter from, select und where verwenden, um Abfragen für Sammlungen ähnlich wie Datenbankabfragen zu schreiben.C# supports Language-Integrated Query (LINQ), which lets you use the reserved words from, select, and where to write queries against collections in a way that is similar to database queries.

Natürlich gibt es noch viele weitere Unterschiede zwischen C# und Java, die in diesem Artikel behandelt werden können.Of course, there are many more differences between C# and Java than can be covered in this article. Außerdem entwickeln sich sowohl Java als auch C# ständig weiter (z.B. Java 8, das noch nicht in der Android-Toolkette enthalten ist und Lambdaausdrücke im C#-Stil unterstützt), sodass sich diese Unterschiede im Lauf der Zeit ändern werden.Also, both Java and C# continue to evolve (for example, Java 8, which is not yet in the Android toolchain, supports C#-style lambda expressions) so these differences will change over time. Hier werden nur die wichtigsten Unterschiede aufgezeigt, die Java-Entwickler, die neu in Xamarin.Android einsteigen, zurzeit feststellen.Only the most important differences currently encountered by Java developers new to Xamarin.Android are outlined here.

C# bringt viele wichtige Features in Xamarin.Android ein, die zurzeit für Java-Entwickler unter Android nicht ohne weiteres verfügbar sind.C# brings many key features to Xamarin.Android that are not currently readily available to Java developers on Android. Diese Features können Sie dabei unterstützen, besseren Code in kürzerer Zeit zu schreiben:These features can help you to write better code in less time:

  • Eigenschaften – Mit dem Eigenschaftensystem von C# können Sie sicher und direkt auf Membervariablen zugreifen, ohne Setter- und Getter-Methoden schreiben zu müssen.Properties – With C#'s property system, you can access member variables safely and directly without having to write setter and getter methods.

  • Lambdaausdrücke: In C# können Sie anonyme Methoden (auch als Lambdaausdrücke bezeichnet) verwenden, um eine bestimmte Logik prägnanter und effizienter auszudrücken.Lambda Expressions – In C# you can use anonymous methods (also called lambdas) to express your functionality more succinctly and more efficiently. Sie können den Mehraufwand für das Schreiben von Objekten vermeiden, die nur ein Mal verwendet werden, und Sie können den lokalen Zustand an eine Methode übergeben, ohne Parameter hinzufügen zu müssen.You can avoid the overhead of having to write one-time-use objects, and you can pass local state to a method without having to add parameters.

  • Ereignisbehandlung – C# bietet Sprachunterstützung für ereignisgesteuerte Programmierung, bei der ein Objekt registriert werden kann, um benachrichtigt zu werden, wenn ein Ereignis von Interesse eintritt.Event Handling – C# provides language-level support for event-driven programming, where an object can register to be notified when an event of interest occurs. Das Schlüsselwort event definiert einen Multicast-Broadcast-Mechanismus, den eine Publisher-Klasse verwenden kann, um Ereignisabonnenten zu benachrichtigen.The event keyword defines a multicast broadcast mechanism that a publisher class can use to notify event subscribers.

  • Asynchrone Programmierung – Die asynchronen Programmierfunktionen von C# (async/await) sorgen dafür, dass Apps schnell reagieren.Asynchronous Programming – The asynchronous programming features of C# (async/await) keep apps responsive. Durch die Unterstützung dieses Features auf Sprachebene ist die asynchrone Programmierung einfach zu implementieren und weniger fehleranfällig.The language-level support of this feature makes async programming easy to implement and less error-prone.

Schließlich erlaubt es Xamarin, vorhandene Java-Ressourcen mithilfe einer Technologie zu nutzen, die als Bindung bezeichnet wird.Finally, Xamarin allows you to leverage existing Java assets via a technology known as binding. Sie können Ihren vorhandenen Java-Code, Frameworks und Bibliotheken aus C# aufrufen, indem Sie die automatischen Bindungsgeneratoren von Xamarin verwenden.You can call your existing Java code, frameworks, and libraries from C# by making use of Xamarin's automatic binding generators. Zu diesem Zweck erstellen Sie einfach eine statische Bibliothek in Java und stellen sie C# über eine Bindung zur Verfügung.To do this, you simply create a static library in Java and expose it to C# via a binding.

Umstieg von Java- auf C#-EntwicklungGoing From Java to C# Development

In den folgenden Abschnitten werden die grundlegenden Unterschiede bei den ersten Schritten zwischen C# und Java beschrieben, ein späterer Abschnitt erläutert die objektorientierten Unterschiede zwischen diesen Sprachen.The following sections outline the basic "getting started" differences between C# and Java; a later section describes the object-oriented differences between these languages.

Bibliotheken im Vergleich zu AssemblysLibraries vs. Assemblies

Java verpackt verwandte Klassen normalerweise in JAR-Dateien.Java typically packages related classes in .jar files. In C# und .NET werden jedoch wiederverwendbare Teile von vorkompiliertem Code in Assemblys verpackt, die in der Regel als DLL-Dateien verpackt sind.In C# and .NET, however, reusable bits of precompiled code are packaged into assemblies, which are typically packaged as .dll files. Eine Assembly ist eine Bereitstellungseinheit für C#-/.NET-Code, und jede Assembly ist in der Regel einem C#-Projekt zugeordnet.An assembly is a unit of deployment for C#/.NET code, and each assembly is typically associated with a C# project. Assemblys enthalten Zwischencode (IL), der Just-In-Time zur Laufzeit kompiliert wird.Assemblies contain intermediate code (IL) that is just-in-time compiled at runtime.

Weitere Informationen zu Assemblys finden Sie im Artikel Assemblys und der globale Assemblycache.For more information about assemblies, see the Assemblies and the Global Assembly Cache topic.

Pakete im Vergleich zu NamespacesPackages vs. Namespaces

C# verwendet das Schlüsselwort namespace, um verwandte Typen zu gruppieren. Dies ähnelt dem Schlüsselwort package von Java.C# uses the namespace keyword to group related types together; this is similar to Java's package keyword. In der Regel befindet sich eine Xamarin.Android-App in einem Namespace, der für die jeweilige App erstellt wird.Typically, a Xamarin.Android app will reside in a namespace created for that app. Beispielsweise deklariert der folgende C#-Code den Namespacewrapper WeatherApp für eine Wetterbericht-App:For example, the following C# code declares the WeatherApp namespace wrapper for a weather-reporting app:

namespace WeatherApp
{
    ...

Importieren von TypenImporting Types

Wenn Sie Typen verwenden, die in externen Namespaces definiert sind, importieren Sie diese Typen mit einer using-Anweisung (die der import-Anweisung von Java sehr ähnlich ist).When you make use of types defined in external namespaces, you import these types with a using statement (which is very similar to the Java import statement). In Java könnten Sie einen einzelnen Typ mit einer Anweisung wie der folgenden importieren:In Java, you might import a single type with a statement like the following:

import javax.swing.JButton

Sie können ein vollständiges Java-Paket mit einer Anweisung wie der folgenden importieren:You might import an entire Java package with a statement like this:

import javax.swing.*

Die C#-Anweisung using funktioniert auf eine sehr ähnliche Weise, aber sie erlaubt es Ihnen, ein ganzes Paket zu importieren, ohne einen Platzhalter anzugeben.The C# using statement works in a very similar way, but it allows you to import an entire package without specifying a wildcard. Beispielsweise werden Sie häufig eine Reihe von using-Anweisungen am Anfang von Xamarin.Android-Quelldateien sehen, wie in diesem Beispiel gezeigt:For example, you will often see a series of using statements at the beginning of Xamarin.Android source files, as seen in this example:

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;

Diese Anweisungen importieren Funktionalität aus den Namespaces System, Android.App, Android.Content usw.These statements import functionality from the System, Android.App, Android.Content, etc. namespaces.

GenericsGenerics

Sowohl Java als auch C# unterstützen Generics. Dabei handelt es sich um Platzhalter, mit denen Sie verschiedene Typen zur Kompilierungszeit einbinden können.Both Java and C# support generics, which are placeholders that let you plug in different types at compile time. Generics funktionieren jedoch in C# etwas anders.However, generics work slightly differently in C#. In Java stellt Type Erasure Typinformationen nur zur Kompilierungszeit, nicht aber zur Laufzeit zur Verfügung.In Java, type erasure makes type information available only at compile time, but not at run time. Im Gegensatz dazu bietet die .NET-CLR (Common Language Runtime) explizite Unterstützung für generische Typen. Dies bedeutet, dass C# zur Laufzeit Zugriff auf Typinformationen besitzt.By contrast, the .NET common language runtime (CLR) provides explicit support for generic types, which means that C# has access to type information at runtime. In der täglichen Xamarin.Android-Entwicklung ist die Wichtigkeit dieser Unterscheidung häufig nicht offensichtlich, aber wenn Sie Reflektion verwenden, sind Sie von diesem Feature abhängig, um zur Laufzeit auf Typinformationen zuzugreifen.In day-to-day Xamarin.Android development, the importance of this distinction is not often apparent, but if you are using reflection, you will depend on this feature to access type information at run time.

In Xamarin.Android wird Ihnen auffallen, dass häufig die generische Methode FindViewById verwendet wird, um einen Verweis auf ein Layoutsteuerelement zu erhalten.In Xamarin.Android, you will often see the generic method FindViewById used to get a reference to a layout control. Diese Methode akzeptiert einen generischen Typparameter, der den Typ des Steuerelements angibt, der nachgeschlagen werden soll.This method accepts a generic type parameter that specifies the type of control to look up. Beispiel:For example:

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

In diesem Codebeispiel ruft FindViewById einen Verweis auf das TextView-Steuerelement ab, das im Layout als Bezeichnung definiert ist, und gibt es dann als TextView-Typ zurück.In this code example, FindViewById gets a reference to the TextView control that is defined in the layout as Label, then returns it as a TextView type.

Weitere Informationen zu Generics finden Sie im Artikel Generics.For more information about generics, see the Generics topic. Beachten Sie, dass es einige Einschränkungen in der Unterstützung von Xamarin.Android für generische C#-Klassen gibt. Weitere Informationen finden Sie unter Einschränkungen.Note that there are some limitations in Xamarin.Android support for generic C# classes; for more information, see Limitations.

Objektorientierte ProgrammierfeaturesObject-Oriented Programming Features

Sowohl Java als auch C# verwenden sehr ähnliche objektorientierte Programmieridiome:Both Java and C# use very similar object-oriented programming idioms:

  • Alle Klassen werden letztlich von einem einzigen Stammobjekt abgeleitet – alle Java-Objekte von java.lang.Object, während alle C#-Objekte von System.Object abgeleitet werden.All classes are ultimately derived from a single root object – all Java objects derive from java.lang.Object, while all C# objects derive from System.Object.

  • Instanzen von Klassen sind Verweistypen.Instances of classes are reference types.

  • Wenn Sie auf die Eigenschaften und Methoden einer Instanz zugreifen, verwenden Sie den Operator „.“.When you access the properties and methods of an instance, you use the "." operator.

  • Alle Klasseninstanzen werden auf dem Heap über den new-Operator erstellt.All class instances are created on the heap via the new operator.

  • Da beide Sprachen Garbage Collection verwenden, gibt es keine Möglichkeit, nicht verwendete Objekte explizit freizugeben (es gibt also kein Schlüsselwort wie delete, das in C++ verwendet wird).Because both languages use garbage collection, there is no way to explicitly release unused objects (i.e., there is not a delete keyword as there is in C++).

  • Sie können Klassen durch Vererbung erweitern, und beide Sprachen erlauben nur eine einzige Basisklasse pro Typ.You can extend classes through inheritance, and both languages only allow a single base class per type.

  • Sie können Schnittstellen definieren, und eine Klasse kann von mehreren Schnittstellendefinitionen erben (d.h. diese implementieren).You can define interfaces, and a class can inherit from (i.e., implement) multiple interface definitions.

Es gibt jedoch auch einige wichtige Unterschiede:However, there are also some important differences:

  • Java weist zwei leistungsstarke Features auf, die C# nicht unterstützt: anonyme Klassen und innere Klassen.Java has two powerful features that C# does not support: anonymous classes and inner classes. (Allerdings erlaubt C# die Schachtelung von Klassendefinitionen – die geschachtelten Klassen von C# sind wie die statischen geschachtelten Klassen von Java.)(However, C# does allow nesting of class definitions – C#'s nested classes are like Java's static nested classes.)

  • C# unterstützt Strukturtypen im C-Stil (struct), Java hingegen nicht.C# supports C-style structure types (struct) while Java does not.

  • In C# können Sie eine Klassendefinition in separaten Quelldateien implementieren, indem Sie das Schlüsselwort partial verwenden.In C#, you can implement a class definition in separate source files by using the partial keyword.

  • C#-Schnittstellen können keine Felder deklarieren.C# interfaces cannot declare fields.

  • C# verwendet Destruktorsyntax im C++-Stil, um Finalizer auszudrücken.C# uses C++-style destructor syntax to express finalizers. Die Syntax unterscheidet sich von der finalize-Methode von Java, aber die Semantik ist nahezu identisch.The syntax is different from Java's finalize method, but the semantics are nearly the same. (Beachten Sie, dass Destruktoren in C# automatisch den Destruktor der Basisklasse aufrufen – im Gegensatz zu Java, wo ein expliziter Aufruf von super.finalize verwendet wird.)(Note that in C#, destructors automatically call the base-class destructor – in contrast to Java where an explicit call to super.finalize is used.)

KlassenvererbungClass Inheritance

Um eine Klasse in Java zu erweitern, verwenden Sie das Schlüsselwort extends.To extend a class in Java, you use the extends keyword. Um eine Klasse in C# zu erweitern, verwenden Sie einen Doppelpunkt (:), um die Ableitung anzugeben.To extend a class in C#, you use a colon (:) to indicate derivation. Beispielsweise werden Sie in Xamarin.Android-Apps häufig Klassenableitungen sehen, die dem folgenden Codefragment ähneln:For example, in Xamarin.Android apps, you will often see class derivations that resemble the following code fragment:

public class MainActivity : Activity
{
    ...

In diesem Beispiel erbt MainActivity von der Activity-Klasse.In this example, MainActivity inherits from the Activity class.

Um Unterstützung für eine Schnittstelle in Java zu deklarieren, verwenden Sie das Schlüsselwort implements.To declare support for an interface in Java, you use the implements keyword. In C# fügen Sie jedoch einfach Schnittstellennamen zur Liste der Klassen hinzu, von denen geerbt werden soll, wie in diesem Codefragment gezeigt:However, in C#, you simply add interface names to the list of classes to inherit from, as shown in this code fragment:

public class SensorsActivity : Activity, ISensorEventListener
{
    ...

In diesem Beispiel erbt SensorsActivity von Activity und implementiert die in der ISensorEventListener-Schnittstelle deklarierte Funktionalität.In this example, SensorsActivity inherits from Activity and implements the functionality declared in the ISensorEventListener interface. Beachten Sie, dass die Liste der Schnittstellen nach der Basisklasse aufgeführt werden muss (andernfalls erhalten Sie einen Kompilierungsfehler).Note that the list of interfaces must come after the base class (or you will get a compile-time error). Nach der Konvention wird C#-Schnittstellennamen ein „I“ in Großbuchstaben vorangestellt, wodurch es möglich ist, zu bestimmen, welche Klassen Schnittstellen sind, ohne ein Schlüsselwort implements zu benötigen.By convention, C# interface names are prepended with an upper-case "I"; this makes it possible to determine which classes are interfaces without requiring an implements keyword.

Wenn Sie verhindern möchten, dass eine Klasse in C# weiter in Unterklassen aufgeteilt wird, stellen Sie dem Klassennamen in Java sealed voran – in Java stellen Sie dem Klassennamen final voran.When you want to prevent a class from being further subclassed in C#, you precede the class name with sealed – in Java, you precede the class name with final.

Weitere Informationen zu C#-Klassendefinitionen finden Sie in den Artikeln Klassen und Vererbung.For more about C# class definitions, see the Classes and Inheritance topics.

EigenschaftenProperties

In Java werden häufig Mutatormethoden (Setter) und Inspektormethoden (Getter) verwendet, um zu steuern, wie Änderungen an Klassenmembern vorgenommen werden, während diese Member vor externem Code verborgen und geschützt werden.In Java, mutator methods (setters) and inspector methods (getters) are often used to control how changes are made to class members while hiding and protecting these members from outside code. Beispielsweise stellt die Android-Klasse TextView die getText- und setText-Methoden zur Verfügung.For example, the Android TextView class provides getText and setText methods. C# bietet einen ähnlichen, aber direkteren Mechanismus, der als Eigenschaften bezeichnet wird.C# provides a similar but more direct mechanism known as properties. Benutzer einer C#-Klasse können auf eine Eigenschaft auf die gleiche Weise zugreifen wie auf ein Feld, aber jeder Zugriff führt tatsächlich zu einem Methodenaufruf, der für den Aufrufer transparent ist.Users of a C# class can access a property in the same way as they would access a field, but each access actually results in a method call that is transparent to the caller. Diese Methode „hinter den Kulissen“ kann Nebenwirkungen wie das Festlegen anderer Werte, das Ausführen von Konvertierungen oder das Ändern des Objektzustands implementieren.This "under the covers" method can implement side effects such as setting other values, performing conversions, or changing object state.

Eigenschaften werden häufig für den Zugriff auf und die Änderung von UI-Objektmembern (Benutzeroberfläche) verwendet.Properties are often used for accessing and modifying UI (user interface) object members. Beispiel:For example:

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

In diesem Beispiel werden die Werte für Breite und Höhe aus dem Objekt rulerView gelesen, indem auf dessen Eigenschaften MeasuredWidth und MeasuredHeight zugegriffen wird.In this example, width and height values are read from the rulerView object by accessing its MeasuredWidth and MeasuredHeight properties. Beim Lesen dieser Eigenschaften werden Werte aus den zugehörigen (aber verborgenen) Feldwerten hinter den Kulissen abgerufen und an den Aufrufer zurückgegeben.When these properties are read, values from their associated (but hidden) field values are fetched behind the scenes and returned to the caller. Das rulerView-Objekt kann Breiten- und Höhenwerte in einer Maßeinheit (z.B. Pixel) speichern und diese Werte sofort in eine andere Maßeinheit (z.B. Millimeter) umwandeln, wenn auf die Eigenschaften MeasuredWidth und MeasuredHeight zugegriffen wird.The rulerView object may store width and height values in one unit of measurement (say, pixels) and convert these values on-the-fly to a different unit of measurement (say, millimeters) when the MeasuredWidth and MeasuredHeight properties are accessed.

Das rulerView-Objekt weist auch eine Eigenschaft namens DrawingCacheEnabled auf – der Beispielcode legt diese Eigenschaft auf true fest, um den Zeichencache in rulerView zu aktivieren.The rulerView object also has a property called DrawingCacheEnabled – the example code sets this property to true to enable the drawing cache in rulerView. Im Hintergrund wird ein zugehöriges verborgenes Feld mit dem neuen Wert aktualisiert, und möglicherweise werden andere Aspekte des rulerView-Zustands geändert.Behind the scenes, an associated hidden field is updated with the new value, and possibly other aspects of rulerView state are modified. Wenn DrawingCacheEnabled z.B. auf false festgelegt ist, kann rulerView auch alle Informationen aus dem Zeichencache löschen, die sich bereits im Objekt angesammelt haben.For example, when DrawingCacheEnabled is set to false, rulerView may also erase any drawing cache information already accumulated in the object.

Der Zugriff auf Eigenschaften kann Lese-/Schreibzugriff, schreibgeschützt oder lesegeschützt sein.Access to properties can be read/write, read-only, or write-only. Außerdem können Sie verschiedene Zugriffsmodifizierer zum Lesen und Schreiben verwenden.Also, you can use different access modifiers for reading and writing. Beispielsweise können Sie eine Eigenschaft definieren, die über öffentlichen Lesezugriff, aber privaten Schreibzugriff verfügt.For example, you can define a property that has public read access but private write access.

Weitere Informationen zu C#-Eigenschaften finden Sie im Artikel Eigenschaften.For more information about C# properties, see the Properties topic.

Aufrufen von BasisklassenmethodenCalling Base Class Methods

Um einen Basisklassenkonstruktor in C# aufzurufen, verwenden Sie einen Doppelpunkt (:), gefolgt vom Schlüsselwort base und einer Initialisierungsliste. Dieser base Konstruktoraufruf wird unmittelbar hinter der abgeleiteten Konstruktorparameterliste platziert.To call a base-class constructor in C#, you use a colon (:) followed by the base keyword and an initializer list; this base constructor call is placed immediately after the derived constructor parameter list. Der Basisklassenkonstruktor wird beim Eintritt in den abgeleiteten Konstruktor aufgerufen. Der Compiler fügt den Aufruf des Basiskonstruktors am Anfang des Methodentexts ein.The base-class constructor is called on entry to the derived constructor; the compiler inserts the call to the base constructor at the start of the method body. Das folgende Codefragment zeigt einen Basiskonstruktor, der von einem abgeleiteten Konstruktor in einer Xamarin.Android-App aufgerufen wird:The following code fragment illustrates a base constructor called from a derived constructor in a Xamarin.Android app:

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

In diesem Beispiel wird die PictureLayout-Klasse von der ViewGroup-Klasse abgeleitet.In this example, the PictureLayout class is derived from the ViewGroup class. Der in diesem Beispiel gezeigte PictureLayout-Konstruktor akzeptiert ein context-Argument und übergibt es über den base(context)-Aufruf an den ViewGroup-Konstruktor.The PictureLayout constructor shown in this example accepts a context argument and passes it to the ViewGroup constructor via the base(context) call.

Um eine Basisklassenmethode in C# aufzurufen, verwenden Sie das Schlüsselwort base.To call a base-class method in C#, use the base keyword. Beispielsweise rufen Xamarin.Android-Apps häufig Basismethoden auf, wie hier gezeigt:For example, Xamarin.Android apps often make calls to base methods as shown here:

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

In diesem Fall ruft die OnCreate-Methode, die durch die abgeleitete Klasse (MainActivity) definiert ist, die OnCreate-Methode der Basisklasse (Activity) auf.In this case, the OnCreate method defined by the derived class (MainActivity) calls the OnCreate method of the base class (Activity).

ZugriffsmodifiziererAccess Modifiers

Java und C# unterstützen die Zugriffsmodifizierer public, private, und protected.Java and C# both support the public, private, and protected access modifiers. Allerdings unterstützt C# zwei weitere Zugriffsmodifizierer:However, C# supports two additional access modifiers:

  • internal – Auf den Klassenmember kann nur in der aktuellen Assembly zugegriffen werden.internal – The class member is accessible only within the current assembly.

  • protected internal – Auf den Klassenmember kann innerhalb der definierenden Assembly, der definierenden Klasse und der abgeleiteten Klassen (abgeleitete Klassen sowohl innerhalb als auch außerhalb der Assembly besitzen Zugriff) zugegriffen werden.protected internal – The class member is accessible within the defining assembly, the defining class, and derived classes (derived classes both inside and outside the assembly have access).

Weitere Informationen zu C#-Zugriffsmodifizierern finden Sie im Artikel Zugriffsmodifizierer.For more information about C# access modifiers, see the Access Modifiers topic.

Virtuelle und überschreibende MethodenVirtual and Override Methods

Sowohl Java als auch C# unterstützen Polymorphismus: die Fähigkeit, verwandte Objekte auf die gleiche Weise zu behandeln.Both Java and C# support polymorphism, the ability to treat related objects in the same manner. In beiden Sprachen können Sie einen Basisklassenverweis verwenden, um auf ein abgeleitetes Klassenobjekt zu verweisen, und die Methoden einer abgeleiteten Klasse können die Methoden ihrer Basisklassen überschreiben.In both languages, you can use a base-class reference to refer to a derived-class object, and the methods of a derived class can override the methods of its base classes. Beide Sprachen verfügen über das Konzept einer virtuellen Methode, einer Methode in einer Basisklasse, die darauf ausgelegt ist, durch eine Methode in einer abgeleiteten Klasse ersetzt zu werden.Both languages have the concept of a virtual method, a method in a base class that is designed to be replaced by a method in a derived class. Wie Java unterstützt C# abstract-Klassen und -Methoden.Like Java, C# supports abstract classes and methods.

Allerdings gibt es einige Unterschiede zwischen Java und C# in der Art und Weise, wie virtuelle Methoden deklariert und überschrieben werden:However, there are some differences between Java and C# in how you declare virtual methods and override them:

  • In C# sind Methoden standardmäßig nicht virtuell.In C#, methods are non-virtual by default. Übergeordnete Klassen müssen explizit angeben, welche Methoden mit dem Schlüsselwort virtual überschrieben werden sollen.Parent classes must explicitly label which methods are to be overridden by using the virtual keyword. Im Gegensatz dazu sind alle Methoden in Java standardmäßig virtuelle Methoden.By contrast, all methods in Java are virtual methods by default.

  • Um zu verhindern, dass eine Methode in C# überschrieben wird, lassen Sie einfach das virtual-Schlüsselwort aus.To prevent a method from being overridden in C#, you simply leave off the virtual keyword. Im Gegensatz dazu verwendet Java das Schlüsselwort final, um eine Methode mit „Überschreiben unzulässig“ zu markieren.By contrast, Java uses the final keyword to mark a method with "override is not allowed."

  • Abgeleitete Klassen in C# müssen das Schlüsselwort override verwenden, um explizit anzugeben, dass eine Methode der virtuellen Basisklasse überschrieben wird.C# derived classes must use the override keyword to explicitly indicate that a virtual base-class method is being overridden.

Weitere Informationen zur Unterstützung von C# für Polymorphismus finden Sie im Artikel Polymorphismus.For more information about C#'s support for polymorphism, see the Polymorphism topic.

Lambda-AusdrückeLambda Expressions

C# ermöglicht es, Umschließungen zu erstellen: anonyme Inlinemethoden, die auf den Zustand der Methode zugreifen können, in der sie eingeschlossen sind.C# makes it possible to create closures: inline, anonymous methods that can access the state of the method in which they are enclosed. Mit Lambdaausdrücken können Sie weniger Zeilen Code schreiben, um die gleiche Funktionalität zu implementieren, die Sie in Java ggf. mit viel mehr Codezeilen implementiert haben.Using lambda expressions, you can write fewer lines of code to implement the same functionality that you might have implemented in Java with many more lines of code.

Lambdaausdrücke ermöglichen es Ihnen, den zusätzlichen Aufwand zu umgehen, der bei der Erstellung einer Klasse für die einmalige Verwendung oder einer anonymen Klasse wie in Java entstehen würde – stattdessen können Sie einfach die Geschäftslogik Ihres Methodencodes inline schreiben.Lambda expressions make it possible for you to skip the extra ceremony involved in creating a one-time-use class or anonymous class as you would in Java – instead, you can just write the business logic of your method code inline. Da Lambdaausdrücke Zugriff auf die Variablen in der umgebenden Methode besitzen, müssen Sie auch keine lange Parameterliste erstellen, um den Status an Ihren Methodencode zu übergeben.Also, because lambdas have access to the variables in the surrounding method, you don't have to create a long parameter list to pass state to your method code.

In C# werden Lambdaausdrücke mit dem Operator => erstellt, wie hier gezeigt:In C#, lambda expressions are created with the => operator as shown here:

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

In Xamarin.Android werden Lambdaausdrücke häufig zum Definieren von Ereignishandlern verwendet.In Xamarin.Android, lambda expressions are often used for defining event handlers. Beispiel:For example:

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

In diesem Beispiel inkrementiert der Lambdaausdruckscode (der Code innerhalb der geschweiften Klammern) die Anzahl der Klicks und aktualisiert den button-Text, um die Anzahl der Klicks anzuzeigen.In this example, the lambda expression code (the code within the curly braces) increments a click count and updates the button text to display the click count. Dieser Lambdaausdruck wird mit dem button-Objekt als Klickereignishandler registriert, der immer dann aufgerufen wird, wenn auf die Schaltfläche getippt wird.This lambda expression is registered with the button object as a click event handler to be called whenever the button is tapped. (Ereignishandler werden weiter unten näher erläutert.) In diesem einfachen Beispiel werden die Parameter sender und args nicht vom Lambdaausdruckscode verwendet, aber sie sind im Lambdaausdruck erforderlich, um die Methodensignaturanforderungen für die Ereignisregistrierung zu erfüllen.(Event handlers are explained in more detail below.) In this simple example, the sender and args parameters are not used by the lambda expression code, but they are required in the lambda expression to meet the method signature requirements for event registration. Im Hintergrund übersetzt der C#-Compiler den Lambdaausdruck in eine anonyme Methode, die immer dann aufgerufen wird, wenn Klickereignisse der Schaltfläche stattfinden.Under the hood, the C# compiler translates the lambda expression into an anonymous method that is called whenever button click events take place.

Weitere Informationen zu C# und Lambdaausdrücken finden Sie im Artikel Lambdaausdrücke.For more information about C# and lambda expressions, see the Lambda Expressions topic.

EreignisbehandlungEvent Handling

Ein Ereignis ist eine Möglichkeit für ein Objekt, registrierte Abonnenten zu benachrichtigen, wenn diesem Objekt etwas Interessantes passiert.An event is a way for an object to notify registered subscribers when something interesting happens to that object. Anders als in Java, wo ein Abonnent typischerweise eine Listener-Schnittstelle implementiert, die eine Rückrufmethode enthält, bietet C# Unterstützung auf Sprachebene für die Ereignisbehandlung durch Delegaten.Unlike in Java, where a subscriber typically implements a Listener interface that contains a callback method, C# provides language-level support for event handling through delegates. Ein Delegat ähnelt einem objektorientierten typsicheren Funktionszeiger – er kapselt einen Objektverweis und ein Methodentoken.A delegate is like an object-oriented type-safe function pointer – it encapsulates an object reference and a method token. Wenn ein Clientobjekt ein Ereignis abonnieren möchte, erstellt es einen Delegaten und übergibt den Delegaten an das benachrichtigende Objekt.If a client object wants to subscribe to an event, it creates a delegate and passes the delegate to the notifying object. Wenn das Ereignis eintritt, ruft das benachrichtigende Objekt die Methode auf, die durch das Delegatobjekt dargestellt wird, und benachrichtigt das abonnierende Clientobjekt über das Ereignis.When the event occurs, the notifying object invokes the method represented by the delegate object, notifying the subscribing client object of the event. In C# sind Ereignishandler im Wesentlichen nichts anderes als Methoden, die durch Delegaten aufgerufen werden.In C#, event handlers are essentially nothing more than methods that are invoked through delegates.

Weitere Informationen zu Delegaten finden Sie im Artikel Delegaten.For more information about delegates, see the Delegates topic.

In C# sind Ereignisse multicast. Das heißt, dass mehrere Listener benachrichtigt werden können, wenn ein Ereignis stattfindet.In C#, events are multicast; that is, more than one listener can be notified when an event takes place. Dieser Unterschied wird beobachtet, wenn Sie die syntaktischen Unterschiede zwischen Java- und C#-Ereignisregistrierung berücksichtigen.This difference is observed when you consider the syntactical differences between Java and C# event registration. In Java rufen Sie SetXXXListener auf, um sich für Ereignisbenachrichtigungen zu registrieren. In C# verwenden Sie den Operator +=, um sich für Ereignisbenachrichtigungen zu registrieren, indem Sie Ihren Delegaten der Liste der Ereignislistener „hinzufügen“.In Java you call SetXXXListener to register for event notifications; in C# you use the += operator to register for event notifications by "adding" your delegate to the list of event listeners. In Java rufen Sie SetXXXListener auf, um die Registrierung aufzuheben, während Sie in C# -= verwenden, um Ihren Delegaten von der Liste der Listener zu „subtrahieren“.In Java, you call SetXXXListener to unregister, while in C# you use the -= to "subtract" your delegate from the list of listeners.

In Xamarin.Android werden Ereignisse häufig dazu verwendet, Objekte zu benachrichtigen, wenn ein Benutzer eine Aktion mit einem Oberflächensteuerelement ausführt.In Xamarin.Android, events are often used for notifying objects when a user does something to a UI control. Normalerweise besitzt ein Oberflächensteuerelement Member, die mit dem Schlüsselwort event definiert sind. Sie fügen Ihre Delegaten diesen Membern hinzu, um Ereignisse dieses Oberflächensteuerelements zu abonnieren.Normally, a UI control will have members that are defined using the event keyword; you attach your delegates to these members to subscribe to events from that UI control.

So abonnieren Sie ein Ereignis:To subscribe to an event:

  1. Erstellen Sie ein Delegatobjekt, das auf die Methode verweist, die beim Auftreten des Ereignisses aufgerufen werden soll.Create a delegate object that refers to the method that you want to be invoked when the event occurs.

  2. Verwenden Sie den Operator +=, um Ihren Delegaten an das Ereignis anzufügen, das Sie abonnieren.Use the += operator to attach your delegate to the event you are subscribing to.

Das folgende Beispiel definiert einen Delegaten (mit einer expliziten Verwendung des Schlüsselworts delegate), der Schaltflächenklicks abonniert.The following example defines a delegate (with an explicit use of the delegate keyword) to subscribe to button clicks. Dieser Schaltflächenklickhandler startet eine neue Aktivität:This button-click handler starts a new activity:

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

Allerdings können Sie auch einen Lambdaausdruck verwenden, um sich für Ereignisse zu registrieren, und das Schlüsselwort delegate ganz auslassen.However, you also can use a lambda expression to register for events, skipping the delegate keyword altogether. Beispiel:For example:

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

In diesem Beispiel weist das startActivityButton-Objekt ein Ereignis auf, das einen Delegaten mit einer bestimmten Methodensignatur erwartet: einen Delegaten, der Absender- und Ereignisargumente akzeptiert und void zurückgibt.In this example, the startActivityButton object has an event that expects a delegate with a certain method signature: one that accepts sender and event arguments and returns void. Da wir uns jedoch nicht die Mühe machen wollen, einen solchen Delegaten oder seine Methode explizit zu definieren, deklarieren wir die Signatur der Methode mit (sender, e) und verwenden einen Lambdaausdruck, um den Text des Ereignishandlers zu implementieren.However, because we don't want to go to the trouble to explicitly define such a delegate or its method, we declare the signature of the method with (sender, e) and use a lambda expression to implement the body of the event handler. Beachten Sie, dass wir diese Parameterliste deklarieren müssen, obwohl wir die Parameter sender und e nicht verwenden.Note that we have to declare this parameter list even though we aren't using the sender and e parameters.

Es ist wichtig, sich daran zu erinnern, dass Sie einen Delegaten austragen können (über den Operator -=), aber Sie können einen Lambdaausdruck nicht austragen – ein solcher Versuch kann zu Arbeitsspeicherverlusten führen.It is important to remember that you can unsubscribe a delegate (via the -= operator), but you cannot unsubscribe a lambda expression – attempting to do so can cause memory leaks. Verwenden Sie die Lambdaform der Ereignisregistrierung nur dann, wenn Ihr Handler das Ereignis nicht austragen wird.Use the lambda form of event registration only when your handler will not unsubscribe from the event.

In der Regel werden Lambdaausdrücke verwendet, um Ereignishandler im Xamarin.Android-Code zu deklarieren.Typically, lambda expressions are used to declare event handlers in Xamarin.Android code. Diese verkürzte Art und Weise, Ereignishandler zu deklarieren, mag zunächst kryptisch erscheinen, spart aber enorm viel Zeit beim Schreiben und Lesen von Code.This shorthand way to declare event handlers may seem cryptic at first, but it saves an enormous amount of time when you are writing and reading code. Mit zunehmender Vertrautheit gewöhnen Sie sich daran, dieses Muster zu erkennen (das häufig in Xamarin.Android-Code vorkommt), und verbringen mehr Zeit damit, über die Geschäftslogik Ihrer Anwendung nachzudenken, anstatt sich mit syntaktischem Mehraufwand herumzuschlagen.With increasing familiarity, you become accustomed to recognizing this pattern (which occurs frequently in Xamarin.Android code), and you spend more time thinking about the business logic of your application and less time wading through syntactical overhead.

Asynchrone ProgrammierungAsynchronous Programming

Asynchrone Programmierung ist eine Möglichkeit, die allgemeine Reaktionsfähigkeit Ihrer Anwendung zu verbessern.Asynchronous programming is a way to improve the overall responsiveness of your application. Asynchrone Programmierungsfeatures ermöglichen es, dass der Rest des Programmcodes weiterhin ausgeführt wird, während ein Teil der Anwendung durch einen langwierigen Vorgang blockiert wird.Asynchronous programming features make it possible for the rest of your app code to continue running while some part of your app is blocked by a lengthy operation. Der Zugriff auf das Web, die Verarbeitung von Bildern und das Lesen/Schreiben von Dateien sind Beispiele für Vorgänge, die dazu führen können, dass eine ganze App einzufrieren scheint, wenn sie nicht asynchron geschrieben wird.Accessing the web, processing images, and reading/writing files are examples of operations that can cause an entire app to appear to freeze up if it is not written asynchronously.

C# enthält Unterstützung auf Sprachebene für asynchrone Programmierung über die Schlüsselwörter async und await.C# includes language-level support for asynchronous programming via the async and await keywords. Diese Sprachfeatures machen es sehr einfach, Code zu schreiben, der Tasks mit langer Ausführungszeit ausführt, ohne den Hauptthread Ihrer Anwendung zu blockieren.These language features make it very easy to write code that performs long-running tasks without blocking the main thread of your application. Kurz gesagt, verwenden Sie das Schlüsselwort async für eine Methode, um anzugeben, dass der Code in der Methode asynchron ausgeführt werden soll und nicht den Thread des Aufrufers blockiert.Briefly, you use the async keyword on a method to indicate that the code in the method is to run asynchronously and not block the caller's thread. Sie verwenden das Schlüsselwort await, wenn Sie Methoden aufrufen, die mit async gekennzeichnet sind.You use the await keyword when you call methods that are marked with async. Der Compiler interpretiert await als den Punkt, an dem Ihre Methodenausführung in einen Hintergrundthread verschoben werden soll (ein Task wird an den Aufrufer zurückgegeben).The compiler interprets the await as the point where your method execution is to be moved to a background thread (a task is returned to the caller). Wenn dieser Task beendet ist, wird die Ausführung des Codes für den Thread des Anrufers am await-Punkt in Ihrem Code fortgesetzt, und die Ergebnisse des async-Aufrufs werden zurückgegeben.When this task completes, execution of the code resumes on the caller's thread at the await point in your code, returning the results of the async call. Gemäß der Konvention verwenden Methoden, die asynchron ausgeführt werden, Async als Suffix ihres Namens.By convention, methods that run asynchronously have Async suffixed to their names.

In Xamarin.Android-Anwendungen werden async und await in der Regel verwendet, um den UI-Thread freizugeben, sodass er auf Benutzereingaben reagieren kann (wie z.B. das Tippen auf eine Schaltfläche Abbrechen), während ein Vorgang mit langer Ausführungszeit in einem Hintergrundtask stattfindet.In Xamarin.Android applications, async and await are typically used to free up the UI thread so that it can respond to user input (such as the tapping of a Cancel button) while a long-running operation takes place in a background task.

Im folgenden Beispiel bewirkt ein Schaltflächenklick-Ereignishandler, dass ein asynchroner Vorgang ein Bild aus dem Web herunterlädt:In the following example, a button click event handler causes an asynchronous operation to download an image from the web:

downloadButton.Click += downloadAsync;
...
async void downloadAsync(object sender, System.EventArgs e)
{
    webClient = new WebClient ();
    var url = new Uri ("http://photojournal.jpl.nasa.gov/jpeg/PIA15416.jpg");
    byte[] bytes = null;

    bytes = await webClient.DownloadDataTaskAsync(url);

    // display the downloaded image ...

Wenn der Benutzer in diesem Beispiel auf das Steuerelement downloadButton klickt, erstellt der downloadAsync-Ereignishandler ein WebClient-Objekt und ein Uri-Objekt, um ein Bild von der angegebenen URL abzurufen.In this example, when the user clicks the downloadButton control, the downloadAsync event handler creates a WebClient object and a Uri object to fetch an image from the specifed URL. Anschließend ruft er die DownloadDataTaskAsync-Methode des WebClient-Objekts mit dieser URL zum Abrufen des Bilds auf.Next, it calls the WebClient object's DownloadDataTaskAsync method with this URL to retrieve the image.

Beachten Sie, dass die Methodendeklaration von downloadAsync durch das Schlüsselwort async eingeleitet wird, um anzugeben, dass sie asynchron ausgeführt wird und einen Task zurückgibt.Notice that the method declaration of downloadAsync is prefaced by the async keyword to indicate that it will run asynchronously and return a task. Beachten Sie auch, dass dem Aufruf von DownloadDataTaskAsync das Schlüsselwort await vorangestellt ist.Also note that the call to DownloadDataTaskAsync is preceded by the await keyword. Die App verschiebt die Ausführung des Ereignishandlers (beginnend an der Stelle, an der await auftritt) in einen Hintergrundthread, bis DownloadDataTaskAsync beendet ist und die Rückgabe erfolgt.The app moves the execution of the event handler (starting at the point where await appears) to a background thread until DownloadDataTaskAsync completes and returns. In der Zwischenzeit kann der UI-Thread der App immer noch auf Benutzereingaben reagieren und Ereignishandler für die anderen Steuerelemente auslösen.Meanwhile, the app's UI thread can still respond to user input and fire event handlers for the other controls. Wenn DownloadDataTaskAsync abgeschlossen ist (dies kann einige Sekunden dauern), wird die Ausführung fortgesetzt, wobei die Variable bytes auf das Ergebnis des Aufrufs von DownloadDataTaskAsync festgelegt wird und der Rest des Ereignishandlercodes das heruntergeladene Bild im Thread des Anrufers (Benutzeroberfläche) anzeigt.When DownloadDataTaskAsync completes (which may take several seconds), execution resumes where the bytes variable is set to the result of the call to DownloadDataTaskAsync, and the remainder of the event handler code displays the downloaded image on the caller's (UI) thread.

Eine Einführung zu async/await in C# finden Sie im Artikel Asynchrones Programmieren mit Async und Await.For an introduction to async/await in C#, see the Asynchronous Programming with Async and Await topic. Weitere Informationen zur Xamarin-Unterstützung von asynchronen Programmierfeatures finden Sie unter Unterstützung asynchroner Features: Übersicht.For more information about Xamarin support of asynchronous programming features, see Async Support Overview.

SchlüsselwortunterschiedeKeyword Differences

Viele Sprachschlüsselwörter, die in Java verwendet werden, werden auch in C# verwendet.Many language keywords used in Java are also used in C#. Es gibt auch eine Reihe von Java-Schlüsselwörtern, die ein äquivalentes, aber anders benanntes Gegenstück in C# haben, wie in der folgenden Tabelle aufgeführt:There are also a number of Java keywords that have an equivalent but differently-named counterpart in C#, as listed in this table:

JavaJava C#C# BESCHREIBUNGDescription
boolean boolbool Wird zum Deklarieren der booleschen Werte „true“ und „false“ verwendet.Used for declaring the boolean values true and false.
extends : Wird der Klasse und den Schnittstellen, von denen geerbt werden soll, vorangestellt.Precedes the class and interfaces to inherit from.
implements : Wird der Klasse und den Schnittstellen, von denen geerbt werden soll, vorangestellt.Precedes the class and interfaces to inherit from.
import usingusing Importiert Typen aus einem Namespace. Wird auch zum Erstellen eines Namespacealias verwendet.Imports types from a namespace, also used for creating a namespace alias.
final sealedsealed Verhindert die Ableitung von Klassen. Verhindert, dass Methoden und Eigenschaften in abgeleiteten Klassen überschrieben werden.Prevents class derivation; prevents methods and properties from being overridden in derived classes.
instanceof isis Wertet aus, ob ein Objekt mit einem angegebenen Typ kompatibel ist.Evaluates whether an object is compatible with a given type.
native externextern Deklariert eine Methode, die extern implementiert wird.Declares a method that is implemented externally.
package namespacenamespace Deklariert einen Bereich für eine in Beziehung stehende Gruppe von Objekten.Declares a scope for a related set of objects.
T... params Tparams T Gibt einen Methodenparameter an, der eine variable Anzahl von Argumenten annimmt.Specifies a method parameter that takes a variable number of arguments.
super basebase Wird verwendet, um auf Member der übergeordneten Klasse aus einer abgeleiteten Klasse heraus zuzugreifen.Used to access members of the parent class from within a derived class.
synchronized locklock Umschließt einen wichtigen Abschnitt des Codes durch den Abruf und die Freigabe von Sperren.Wraps a critical section of code with lock acquisition and release.

Außerdem gibt es viele Schlüsselwörter, die einzigartig in C# sind und kein Gegenstück in Java besitzen.Also, there are many keywords that are unique to C# and have no counterpart in Java. Xamarin.Android-Code verwendet häufig die folgenden C#-Schlüsselwörter (diese Tabelle ist nützlich, um sich auf sie zu beziehen, wenn Sie Xamarin.Android-Beispielcode lesen):Xamarin.Android code often makes use of the following C# keywords (this table is useful to refer to when you are reading through Xamarin.Android sample code):

C#C# BESCHREIBUNGDescription
asas Führt Konvertierungen zwischen kompatiblen Verweistypen oder Nullwerte zulassenden Typen aus.Performs conversions between compatible reference types or nullable types.
asyncasync Gibt an, dass eine Methode oder ein Lambdaausdruck asynchron ist.Specifies that a method or lambda expression is asynchronous.
awaitawait Hält die Ausführung einer Methode an, bis ein Task abgeschlossen ist.Suspends the execution of a method until a task completes.
bytebyte 8-Bit-Ganzzahltyp ohne Vorzeichen.Unsigned 8-bit integer type.
delegatedelegate Wird verwendet, um eine Methode oder eine anonyme Methode zu kapseln.Used to encapsulate a method or anonymous method.
enumenum Deklariert eine Enumeration, einen Satz benannter Konstanten.Declares an enumeration, a set of named constants.
eventevent Deklariert ein Ereignis in einer Publisher-Klasse.Declares an event in a publisher class.
fixedfixed Verhindert, dass eine Variable verschoben wird.Prevents a variable from being relocated.
get Definiert eine Accessormethode, die den Wert einer Eigenschaft abruft.Defines an accessor method that retrieves the value of a property.
inin Ermöglicht es einem Parameter, einen weniger abgeleiteten Typ in einer generischen Schnittstelle zu akzeptieren.Enables a parameter to accept a less derived type in a generic interface.
objectobject Ein Alias für den Objekttyp in .NET Framework.An alias for the Object type in the .NET framework.
outout Parametermodifizierer oder generische Typparameterdeklaration.Parameter modifier or generic type parameter declaration.
overrideoverride Erweitert oder ändert die Implementierung eines geerbten Member.Extends or modifies the implementation of an inherited member.
partialpartial Deklariert, dass eine Definition in mehrere Dateien aufgeteilt werden soll, oder trennt eine Methodendefinition von ihrer Implementierung.Declares a definition to be split into multiple files, or splits a method definition from its implementation.
readonlyreadonly Deklariert, dass ein Klassenmember nur zum Zeitpunkt der Deklaration oder durch den Klassenkonstruktor zugewiesen werden kann.Declares that a class member can be assigned only at declaration time or by the class constructor.
refref Bewirkt, dass ein Argument nicht als Wert, sondern als Verweis übergeben wird.Causes an argument to be passed by reference rather than by value.
setset Definiert eine Accessormethode, die den Wert einer Eigenschaft festlegt.Defines an accessor method that sets the value of a property.
stringstring Ein Alias für den Zeichenfolgentyp in .NET Framework.Alias for the String type in the .NET framework.
structstruct Ein Werttyp, der eine Gruppe in Beziehung stehender Variablen kapselt.A value type that encapsulates a group of related variables.
typeoftypeof Ruft den Typ eines Objekts ab.Obtains the type of an object.
varvar Deklariert eine implizit typisierte lokale Variable.Declares an implicitly-typed local variable.
valuevalue Verweist auf den Wert, den der Clientcode einer Eigenschaft zuweisen möchte.References the value that client code wants to assign to a property.
virtualvirtual Ermöglicht das Überschreiben einer Methode in einer abgeleiteten Klasse.Allows a method to be overridden in a derived class.

Interoperabilität mit vorhandenen Java-CodeInteroperating with Existing Java Code

Wenn Sie über vorhandene Java-Funktionalität verfügen, die Sie nicht nach C# konvertieren möchten, können Sie Ihre vorhandenen Java-Bibliotheken in Xamarin.Android-Anwendungen mithilfe von zwei Techniken wiederverwenden:If you have existing Java functionality that you do not want to convert to C#, you can reuse your existing Java libraries in Xamarin.Android applications via two techniques:

  • Erstellen einer Java Bindungsbibliothek – Mit diesem Ansatz verwenden Sie Xamarin-Tools, um C#-Wrapper um Java-Typen zu generieren.Create a Java Bindings Library – Using this approach, you use Xamarin tools to generate C# wrappers around Java types. Diese Wrapper werden als Bindungen bezeichnet.These wrappers are called bindings. Als Ergebnis kann Ihre Xamarin.Android-Anwendung Ihre JAR-Datei verwenden, indem sie diese Wrapper aufruft.As a result, your Xamarin.Android application can use your .jar file by calling into these wrappers.

  • Java Native InterfaceJava Native Interface (JNI) ist ein Framework, das es ermöglicht, dass C#-Apps Java-Code aufrufen oder durch Java-Code aufgerufen werden können.Java Native Interface – The Java Native Interface (JNI) is a framework that makes it possible for C# apps to call or be called by Java code.

Weitere Informationen zu diesen Techniken finden Sie unter Übersicht über die Java-Integration.For more information about these techniques, see Java Integration Overview.

Weitere InformationenFor Further Reading

Das C#-Programmierhandbuch von MSDN ist eine großartige Möglichkeit, um mit dem Erlernen der Programmiersprache C# zu beginnen, und Sie können die C#-Referenz verwenden, um bestimmte C#-Sprachfeatures nachzuschlagen.The MSDN C# Programming Guide is a great way to get started in learning the C# programming language, and you can use the C# Reference to look up particular C# language features.

So wie Java-Kenntnisse mindestens genauso viel mit der Vertrautheit mir den Java-Klassenbibliotheken zu tun haben wie mit Kenntnissen der Java-Sprache, so erfordern praktische Kenntnisse von C# eine gewisse Vertrautheit mit .NET-Framework.In the same way that Java knowledge is at least as much about familiarity with the Java class libraries as knowing the Java language, practical knowledge of C# requires some familiarity with the .NET framework. Das Lernpaket Umstieg auf C# und .NET Framework für Java-Entwickler ist ein guter Weg, um mehr über .NET Framework aus Java-Perspektive zu erfahren (und gleichzeitig ein tieferes Verständnis von C# zu erlangen).Microsoft's Moving to C# and the .NET Framework, for Java Developers learning packet is a good way to learn more about the .NET framework from a Java perspective (while gaining a deeper understanding of C#).

Wenn Sie bereit sind, Ihr erstes Xamarin.Android-Projekt in C# in Angriff zu nehmen, kann Ihnen unsere Hallo Android-Serie dabei helfen, Ihre erste Xamarin.Android-Anwendung zu erstellen und Ihr Verständnis der Grundlagen der Android-Anwendungsentwicklung mit Xamarin weiter zu vertiefen.When you are ready to tackle your first Xamarin.Android project in C#, our Hello, Android series can help you build your first Xamarin.Android application and further advance your understanding of the fundamentals of Android application development with Xamarin.

ZusammenfassungSummary

In diesem Artikel wurde eine Einführung in die C#-Programmierumgebung Xamarin.Android aus der Sicht eines Java-Entwicklers bereitgestellt.This article provided an introduction to the Xamarin.Android C# programming environment from a Java developer's perspective. Die Ähnlichkeiten zwischen C# und Java wurde gezeigt, und ihre praktischen Unterschiede wurden erläutert.It pointed out the similarities between C# and Java while explaining their practical differences. Assemblys und Namespaces wurden vorgestellt, der Import externer Typen wurde erläutert und ein Überblick über die Unterschiede bei Zugriffsmodifizierern ermöglicht. Außerdem wurden Informationen zu Generics, Klassenableitung, Aufruf von Methoden der Basisklasse, Methodenüberschreibung und Ereignisbehandlung bereitgestellt.It introduced assemblies and namespaces, explained how to import external types, and provided an overview of the differences in access modifiers, generics, class derivation, calling base-class methods, method overriding, and event handling. Der Artikel hat C#-Funktionen vorgestellt, die in Java nicht verfügbar sind (z.B. Eigenschaften) sowie asynchrone async/await-Programmierung, Lambdaausdrücke, C#-Delegaten und das C#-Ereignisverarbeitungssystem erläutert.It introduced C# features that are not available in Java, such as properties, async/await asynchronous programming, lambdas, C# delegates, and the C# event handling system. Er enthält Tabellen mit wichtigen C#-Schlüsselwörtern, beschreibt, wie die Interaktion mit vorhandenen Java-Bibliotheken erfolgt, und bietet Links zu verwandter Dokumentation für weitere Studien.It included tables of important C# keywords, explained how to interoperate with existing Java libraries, and provided links to related documentation for further study.