Einführung in C# für Objective-C-EntwicklerC# Primer for Objective-C Developers

Xamarin.iOS ermöglicht, in C# geschriebenen plattformunabhängigen Code auf verschiedenen Plattformen gemeinsam zu nutzen. Bestehende iOS-Anwendungen möchten jedoch möglicherweise bereits erstellten Objective-C-Code nutzen. Dieser Artikel dient als kurze Einführung für Objective-C-Entwickler, die zu Xamarin und zur Sprache C# wechseln möchten.Xamarin.iOS allows platform-agnostic code written in C# to be shared across platforms. However, existing iOS applications may want to leverage Objective-C code that has already been created. This article serves as a short primer for Objective-C developers looking to move to Xamarin and the C# language.

iOS- und macOS-Anwendungen, die in Objective-C entwickelt wurden, können von Xamarin profitieren, indem C# an Stellen eingesetzt wird, an denen plattformspezifischer Code nicht erforderlich ist. Dadurch kann dieser Code auf Geräten verwendet werden, die nicht von Apple stammen.iOS and macOS applications developed in Objective-C can benefit from Xamarin by leveraging C# in places where platform-specific code is not required, allowing such code to be used on non-Apple devices. Elemente wie Webdienste, JSON- und XML-Analysen sowie benutzerdefinierte Algorithmen können dann plattformübergreifend verwendet werden.Things such as web services, JSON and XML parsing, and custom algorithms can then be used in a cross-platform manner.

Um die Vorteile von Xamarin unter Beibehaltung bestehender Objective-C-Ressourcen zu nutzen, können diese für C# in einer Technologie von Xamarin verfügbar gemacht werden, die als Bindungen bekannt ist. Diese hat den Zweck, den Objective-C-Code der verwalteten C#-Welt zugänglich zu machen.To take advantage of Xamarin while maintaining existing Objective-C assets, the former can be exposed to C# in a technology from Xamarin known as bindings, which surface Objective-C code to the managed, C# world. Auf Wunsch kann Code auch zeilenweise nach C# portiert werden.Also, if desired, code can be ported line-by-line to C# as well. Unabhängig davon, ob der Bindungs- oder Portierungsansatz gewählt wird, sind Objective-C- und C#-Kenntnisse erforderlich, um den vorhandenen Objective-C-Code mit Xamarin.iOS effektiv zu nutzen.Regardless of the approach however, whether it be binding or porting, some knowledge of both Objective-C and C# is necessary to effectively leverage existing Objective-C code with Xamarin.iOS.

Objective-C-InteropObjective-C Interop

Es gibt derzeit keinen unterstützten Mechanismus zur Erstellung einer Bibliothek in C# unter Verwendung von Xamarin.iOS, die in Objective-C aufgerufen werden kann.There is currently no supported mechanism to create a library in C# using Xamarin.iOS that can be called from Objective-C. Der Hauptgrund dafür ist, dass neben der Bindung auch die Mono-Laufzeit benötigt wird.The main reason for this is the Mono runtime is also required in addition to the binding. Sie können jedoch den größten Teil Ihrer Logik in Objective-C erstellen, einschließlich Benutzeroberflächen.However, you can still create the majority of your logic in Objective-C, including user interfaces. Umschließen Sie zu diesem Zweck den Objective-C-Code in einer Bibliothek, und erstellen Sie eine Bindung damit.To do this, wrap the Objective-C code in a library and create a binding to it. Xamarin.iOS ist für das Bootstrapping der Anwendung erforderlich (d. h., es muss den Main-Einstiegspunkt erstellen).Xamarin.iOS is needed to bootstrap the application (meaning it must create the Main entry point). Danach kann sich jede andere Logik in Objective-C befinden, die C# durch die Bindung (oder über P/Invoke) zur Verfügung gestellt wird.After that, any other logic can be in Objective-C, exposed to C# through the binding (or via P/Invoke). Auf diese Weise können Sie die plattformspezifische Logik in Objective-C beibehalten und die plattformunabhängigen Teile in C# entwickeln.This way, you can keep the platform specific logic in Objective-C and develop the platform agnostic parts in C#.

Dieser Artikel hebt einige wichtige Gemeinsamkeiten hervor und stellt einige Unterschiede in beiden Sprachen gegenüber. Diese gilt es bei der Umstellung auf C# mit Xamarin.iOS unabhängig davon zu beachten, ob eine Bindung an bestehenden Objective-C-Code oder dessen Portierung zu C# erfolgt.This article highlights some key similarities, as well as contrasts several differences in both languages to serve as a primer when moving to C# with Xamarin.iOS, whether binding to existing Objective-C code, or porting it to C#.

Informationen zum Erstellen von Bindungen finden Sie in den anderen Dokumenten unter Binden von Objective-C.For details on creating bindings see the other documents in Binding Objective-C.

SprachenvergleichLanguage Comparison

Objective-C und C# sind sehr unterschiedliche Sprachen, sowohl syntaktisch als auch unter Laufzeitgesichtspunkten.Objective-C and C# are very different languages both syntactically and from a runtime standpoint. Objective-C ist eine dynamische Sprache und verwendet ein Nachrichtenübergabeschema, während C# statisch typisiert ist.Objective-C is a dynamic language and uses a message passing scheme, whereas C# is statically typed. Syntaktisch gesehen ist Objective-C wie Smalltalk, während bei C# ein Großteil der grundlegenden Syntax von Java abgeleitet ist, obwohl diese Sprache in den letzten Jahren soweit gereift ist, dass sie viele über Java hinausgehende Funktionen bietet.Syntax-wise, Objective-C is like Smalltalk, whereas C# derives much of its fundamental syntax from Java, although it has matured to include many capabilities beyond Java in recent years.

Dessen ungeachtet gibt es mehrere Sprachmerkmale von Objective-C und C#, die in ihrer Funktionsweise ähnlich sind.That said there are several language features of both Objective-C and C# that are similar in function. Bei der Erstellung einer Bindung zu Objective-C-Code aus C# oder bei Portierung von Objective-C nach C# ist es hilfreich, diese Ähnlichkeiten zu verstehen.When creating a binding to Objective-C code from C# or when porting Objective-C to C#, understanding these similarities is useful.

Protokolle im Vergleich zu SchnittstellenProtocols vs. Interfaces

Objective-C und C# sind Sprachen mit einfacher Vererbung.Both Objective-C and C# are single inheritance languages. Beide Sprachen unterstützen jedoch die Implementierung mehrerer Schnittstellen in einer bestimmten Klasse.However, both languages have support for implementing multiple interfaces in a given class. In Objective-C werden diese logischen Schnittstellen Protokolle genannt, während sie in C# Schnittstellen heißen.In Objective-C these logical interfaces are called protocols whereas in C# they are called interfaces. Implementierungstechnisch ist der Hauptunterschied zwischen einer C#-Schnittstelle und einem Objective-C-Protokoll, dass letzteres optionale Methoden haben kann.Implementation-wise, the main difference between a C# interface and an Objective-C protocol is the latter can have optional methods. Weitere Informationen finden Sie im Artikel Ereignisse, Delegaten und Protokolle.For more information see the Events, Delegates and Protocols article.

Kategorien im Vergleich zu ErweiterungsmethodenCategories vs. Extension methods

Objective-C erlaubt das Hinzufügen von Methoden zu einer Klasse, für die Sie möglicherweise nicht über den Implementierungscode verfügen, mithilfe von Kategorien.Objective-C allows methods to be added to a class for which you may not have the implementation code using Categories. In C# ist ein ähnliches Konzept in Form so genannter Erweiterungsmethoden verfügbar.In C# a similar concept is available through what’s known as extension methods.

Mithilfe von Erweiterungsmethoden können Sie einer Klasse statische Methoden hinzufügen, wobei statische Methoden in C# analog zu Klassenmethoden in Objective-C sind.Extension methods let you add static methods to a class, where static methods in C# are analogous to class methods in Objective-C. Zum Beispiel fügt der folgende Code der UITextView-Klasse eine Methode namens ScrollToBottom hinzu, die wiederum eine verwaltete Klasse ist, die an die Objective-C UITextView-Klasse aus UIKit gebunden ist:For example, the following code adds a method named ScrollToBottom to the UITextView class, which in turn is a managed class that is bound to the Objective-C UITextView class from UIKit:

public static class UITextViewExtensions
{
    public static void ScrollToBottom (this UITextView textView)
    {
        // code to scroll textView
    }
}

Wenn dann eine Instanz von UITextView im Code erstellt wird, steht die Methode in der Liste für die automatische Vervollständigung zur Verfügung, wie unten gezeigt:Then, when an instance of a UITextView is created in code, the method will be available in the autocomplete list as shown below:

Die für die Autovervollständigung verfügbare Methode

Beim Aufruf der Erweiterungsmethode wird die Instanz an das Argument übergeben, wie z. B. textView in diesem Beispiel.When the extension method is called the instance is passed to the argument, such as the textView in this example.

Frameworks im Vergleich zu AssemblysFrameworks vs. Assemblies

Objective-C packt verwandte Klassen in speziellen Verzeichnissen, die als Frameworks bezeichnet werden.Objective-C packages related classes in special directories known as frameworks. In C# und .NET werden hingegen Assemblys verwendet, um wiederverwendbare Bits von vorkompiliertem Code bereitzustellen.In C# and .NET however, assemblies are used to provide reusable bits of precompiled code. In Umgebungen außerhalb von iOS enthalten Assemblys Zwischensprachcode (Intermediate Language, IL), der Just-In-Time (JIT) zur Laufzeit kompiliert wird.In environments outside of iOS, assemblies contain intermediate language code (IL) that is just in time (JIT) compiled at runtime. Apple erlaubt die Ausführung von JIT kompiliertem Code in iOS-Anwendungen jedoch nicht, die im App Store veröffentlicht wurden.However, Apple does not allow execution of JIT compiled code in iOS applications released on the App Store. Daher wird C#-Code, der auf iOS mit Xamarin abzielt, AOT-kompiliert (Ahead of time) und erzeugt eine einzelne ausführbare Unix-Datei zusammen mit Metadatendateien, die im Anwendungspaket enthalten sind.Therefore C# code targeting iOS with Xamarin is ahead of time compiled (AOT), producing a single Unix executable along with metadata files that are included in the application bundle.

Selektoren im Vergleich zu benannten ParameternSelectors vs. Named Parameters

Objective-C-Methoden schließen grundsätzlich Parameternamen in Selektoren ein.Objective-C methods inherently include parameter names in selectors by their very nature. Zum Beispiel macht ein Selektor wie AddCrayon:WithColor: deutlich, was jeder Parameter bedeutet, wenn er im Code verwendet wird.For example a selector such as AddCrayon:WithColor: makes it clear what each parameter means when used in code. C# unterstützt optional auch benannte Argumente.C# optionally supports named arguments as well.

Beispielsweise sieht ähnlicher Code in C# mit benannten Argumenten wie folgt aus:For example, similar code in C# using named arguments would be:

AddCrayon (crayon: myCrayon, color: UIColor.Blue);

Obwohl in C# diese Unterstützung in Version 4.0 der Sprache hinzugefügt wurde, wird sie in der Praxis nicht sehr häufig verwendet.Although C# added this support in version 4.0 of the language, in practice it isn’t used very often. Wenn Sie jedoch in Ihrem Code explizit sein möchten, ist die Unterstützung dafür vorhanden.However, if you want to be explicit in your code, the support for it is there.

Header und NamespacesHeaders and Namespaces

Da Objective-C eine Obermenge von C ist, verwendet Objective-C Header für öffentliche Deklarationen, die von der Implementierungsdatei getrennt sind.Being a superset of C, Objective-C uses headers for public declarations that are separate from the implementation file. C# verwendet keine Headerdateien.C# does not use header files. Im Gegensatz zu Objective-C ist C#-Code in Namespaces enthalten.Unlike Objective-C, C# code is contained in namespaces. Wenn Sie Code, der in einem bestimmten Namespace verfügbar ist, einbinden möchten, fügen Sie entweder eine „using“-Anweisung am Anfang der Implementierungsdatei hinzu, oder qualifizieren Sie den Typ mit dem vollen Namespace.If you want to include code available in some namespace, you add either a using directive to the top of the implementation file, or you qualify the type with the full namespace.

Beispielsweise enthält der folgende Code den Namespace UIKit, wodurch jede Klasse in diesem Namespace der Implementierung zur Verfügung steht:For example, the following code includes the UIKit namespace, making every class in that namespace available to the implementation:

using UIKit;
namespace MyAppNamespace
{
    // implementation of classes
}

Außerdem legt das Schlüsselwort „namespace“ im obigen Code den Namespace fest, der für die Implementierungsdatei selbst verwendet wird.Also, the namespace keyword in the above code sets the namespace used for the implementation file itself. Wenn sich mehrere Implementierungsdateien denselben Namespace teilen, ist es nicht notwendig, den Namespace auch in eine „using“-Anweisung aufzunehmen, wie dies impliziert wird.If multiple implementation files share the same namespace, there’s no need to include the namespace in a using directive as well, as it is implied.

EigenschaftenProperties

Sowohl Objective-C als auch C# arbeiten mit dem Eigenschaftskonzept, um eine allgemeine Abstraktion rund um Accessormethoden zu ermöglichen.Both Objective-C and C# have the concept of properties to provide a high-level abstraction around accessor methods. In Objective-C wird die Compileranweisung @property verwendet, um die Accessormethoden effektiv zu generieren.In Objective-C the @property compiler directive is used to effectively generate the accessor methods. Im Gegensatz dazu bietet C# Unterstützung für Eigenschaften in der Programmiersprache selbst.In contrast, C# includes support for properties within the language itself. Eine C#-Eigenschaft kann entweder mit einem längeren Stil, der auf ein Unterstützungsfeld zugreift, oder mit einer kürzeren, automatischen Eigenschaftssyntax implementiert werden, wie in den folgenden Beispielen gezeigt:A C# property can be implemented using either a longer style that accesses a backing field, or using a shorter, automatic property syntax, as shown in the following examples:

// automatic property syntax
public string Name { get; set; }

// property implemented with a backing field
string address;
public string Address {
    get {
        // could add additional code here
        return address;
    }
    set {
        address = value;
    }
}

Schlüsselwort „static“Static Keyword

Das Schlüsselwort static hat in Objective-C und C# eine sehr unterschiedliche Bedeutung.The static keyword has very different meaning between Objective-C and C#. In Objective-C werden statische Funktionen verwendet, um den Umfang einer Funktion auf die aktuelle Datei zu beschränken.In Objective-C static functions are used to limit the scope of a function to the current file. In C# hingegen wird der Geltungsbereich durch die Schlüsselwörter public, private und internal bestimmt.In C# however, scope is maintained through the public, private and internal keywords.

Wenn das Schlüsselwort „static“ auf eine Variable in Objective-C angewendet wird, behält die Variable ihren Wert funktionsaufrufübergreifend hinweg bei.When the static keyword is applied to a variable in Objective-C, the variable maintains its value across function calls.

C# weist auch das Schlüsselwort „static“ auf.C# also has a static keyword. Wird es auf eine Methode angewendet, geschieht quasi dasselbe wie beim Modifizierer + in Objective-C.When applied to a method, it effectively does the same thing that the + modifier does in Objective-C. Es erstellt eine Klassenmethode.Namely, it creates a class method. Ähnlich verhält es sich, wenn es auf andere Konstrukte wie Felder, Eigenschaften und Ereignisse angewendet wird. Es macht diese zu einem Teil des Typs, in dem sie deklariert sind, und nicht zu einer Instanz dieses Typs.Similarly, when applied to other constructs such as fields, properties and events, it makes those part of the type they are declared within rather than with any instance of that type. Sie können auch eine statische Klasse erstellen, in der alle Methoden, die in der Klasse definiert sind, ebenfalls statisch sein müssen.You can also make a static class, in which all the methods defined in the class must be static as well.

NSArray im Vergleich zu ListeninitialisierungNSArray vs. List Initialization

Objective-C enthält jetzt Literalsyntax für die Verwendung mit NSArray, was die Initialisierung erleichtert.Objective-C now includes literal syntax for use with NSArray, making it easier to initialize. C# weist jedoch einen umfangreicheren Typ namens List auf, der generisch ist, was bedeutet, dass der Typ, den die Liste enthält, durch den Code bereitgestellt werden kann, der die Liste erstellt (wie Vorlagen in C++).C# however has a richer type called a List which is generic, meaning the type the list holds can be provided by the code that creates the list (like templates in C++). Darüber hinaus unterstützen Listen Syntax für die automatische Initialisierung, wie unten gezeigt:Additionally, lists support auto-initialization syntax as shown below:

MyClass object1 = new MyClass ();
MyClass object2 = new MyClass ();
List<MyClass> myList = new List<MyClass>{ object1, object2 };

Blöcke im Vergleich zu Lambda-AusdrückeBlocks vs. Lambda Expressions

Objective-C verwendet Blöcke zum Erstellen von Abschlüssen, wobei Sie eine Funktion inline erstellen können, die den Zustand, in dem sie eingeschlossen ist, nutzen kann.Objective-C uses blocks to create closures, where you can create a function inline that can make use of the state where it is enclosed. C# arbeitet mit einem ähnlichen Konzept, nämlich Lambda-Ausdrücken.C# has a similar concept through the use of lambda expressions. In C# werden Lambdaausdrücke mit dem Operator => erstellt, wie nachstehend gezeigt:In C# lambda expressions are created with the => operator as shown below:

(args) => {
    //  implementation code
};

Weitere Informationen zu Lambda-Ausdrücken finden Sie im C#-Programmierhandbuch von Microsoft.For more information on lambda expressions, see Microsoft’s C# Programming Guide.

ZusammenfassungSummary

In diesem Artikel wurden eine Vielzahl von Sprachmerkmalen von Objective-C und C# verglichen.In this article a variety of language features were contrasted between Objective-C and C#. In einigen Fällen wurden analoge Merkmale hervorgehoben, die in beiden Sprachen vorhanden sind, wie z. B. Blöcke für Lambda-Ausdrücke und Kategorien für Erweiterungsmethoden.In some cases, it called out analogous features that exist between both languages, such as blocks to lambda expressions, and categories to extension methods. Darüber hinaus wurden Punkte unterschieden, an denen die Sprachen voneinander abweichen, wie z. B. Namespaces in C# und die Bedeutung des Schlüsselworts „static“.Additionally, it contrasted places where the languages diverge, such as with namespaces in C# and the meaning of the static keyword.