NSString in Xamarin.iOS und Xamarin.Mac
Sowohl das Design von Xamarin.iOS als auch das von Xamarin.Mac erfordern die Verwendung einer API, um den nativen .NET-Zeichenfolgentyp string
für die Zeichenfolgenbearbeitung in C# und anderen .NET-Programmiersprachen verfügbar zu machen und Zeichenfolgen nicht als Datentyp NSString
, sondern als den von der API offengelegten Datentyp verfügbar zu machen.
Dies bedeutet, dass Entwickler Zeichenfolgen für den Aufruf in Xamarin.iOS & Xamarin.Mac API (Unified) nicht in einem speziellen Typ (Foundation.NSString
) verwalten müssen, sondern weiterhin den System.String
von Mono für alle Operationen verwenden können. Und falls eine API in Xamarin.iOS oder Xamarin.Mac eine Zeichenfolge benötigt, kümmert sich unsere API-Bindung um das Marshalling der Informationen.
Beispielsweise wird die Objective-C-Eigenschaft „text“ für ein UILabel
-Objekt vom Typ NSString
folgendermaßen deklariert:
@property(nonatomic, copy) NSString *text
In Xamarin.iOS erfolgt die Offenlegung wie folgt:
class UILabel {
public string Text { get; set; }
}
Im Hintergrund führt die Implementierung dieser Eigenschaft zum Marshalling der C#-Zeichenfolge in ein NSString
-Objekt, und die objc_msgSend
-Methode wird auf die gleiche Weise aufgerufen, wie dies in Objective-C der Fall wäre.
Es gibt einige Objective-C-APIs von Drittanbietern, die anstelle von NSString
eine C-Zeichenfolge (ein char) nutzen. In diesen Fällen können Sie weiterhin den C#-Zeichenfolgendatentyp verwenden, aber Sie müssen den Bindungsgenerator mit dem [PlainString]-Attribut darüber informieren, dass für diese Zeichenfolge kein Marshalling in einen NSString
, sondern stattdessen in eine C-Zeichenfolge durchgeführt werden muss.
Ausnahmen von der Regel
Sowohl in Xamarin.iOS als auch in Xamarin.Mac gibt es Ausnahmen von dieser Regel. Die Entscheidung, wann wir string
-Objekte und wann ausnahmsweise NSString
-Objekte verfügbar machen, wird getroffen, wenn die NSString
-Methode einen Zeigervergleich anstelle eines Inhaltsvergleichs durchführen kann.
Dies kann vorkommen, wenn eine Objective-C-API eine öffentliche NSString
-Konstante als Token verwendet, die eine Aktion repräsentiert, statt die tatsächlichen Inhalte der Zeichenfolge zu vergleichen.
In diesen Fällen werden NSString
-APIs verfügbar gemacht. Dies gilt für einige wenige APIs. Darüber hinaus werden Sie feststellen, dass NSString-Eigenschaften in einigen Klassen verfügbar gemacht werden. Diese NSString
Eigenschaften werden für Elemente wie Benachrichtigungen verfügbar gemacht. Diese Eigenschaften sehen üblicherweise wie folgt aus:
class Foo {
public NSString FooNotification { get; }
}
Benachrichtigungen sind Schlüssel, die für die NSNotification
-Klasse verwendet werden, wenn Sie sich für ein bestimmtes Ereignis registrieren möchten, das von der Runtime übertragen wird.
Schlüssel sehen in der Regel ungefähr so aus:
class Foo {
public NSString FooBarKey { get; }
}
Eine weitere Stelle, an der NSString
-Elemente in der API verfügbar gemacht werden, sind Token, die als Parameter für bestimmte APIs in iOS oder OS X verwendet werden, die NSDictionary
-Objekte als Parameter verwenden. Das Wörterbuch enthält typischerweise NSString
-Schlüssel. Xamarin.iOS benennt diese statischen NSString
-Eigenschaften per Konvention durch Hinzufügen des Namens „Key“.