Xamarin.iOS 和 Xamarin.Mac 中的 NSString
Xamarin.iOS 和 Xamarin.Mac 的设计都要求使用 API 来公开本机 .NET 字符串类型 (string
),以便通过 C# 和其他 .NET 编程语言进行字符串操作,并将字符串公开为 API 公开的数据类型,而不是 NSString
数据类型。
这意味着开发人员无需在特殊类型 (Foundation.NSString
) 中保留用于调用 Xamarin.iOS 和 Xamarin.Mac API(统一)的字符串,他们可以在所有操作中继续使用 Mono 的 System.String
,而在 Xamarin.iOS 或 Xamarin.Mac 中的 API 需要字符串时,我们的 API 绑定将负责封送信息。
例如,类型为 NSString
的 UILabel
上的 Objective-C“text”属性声明如下:
@property(nonatomic, copy) NSString *text
这在 Xamarin.iOS 中公开为:
class UILabel {
public string Text { get; set; }
}
在后台,此属性的实现将 C# 字符串封送到 NSString
中,并以与 Objective-C 相同的方式调用 objc_msgSend
方法。
有少量的第三方 Objective-C API 不使用 NSString
,而使用 C 字符串(“char”)。 在这些情况下,仍可以使用 C# 字符串数据类型,但必须使用 [PlainString] 属性来通知绑定生成器,告知它此字符串不应作为 NSString
封送,而应作为 C 字符串封送。
规则的例外情况
在 Xamarin.iOS 和 Xamarin.Mac 中,此规则有一个例外。 如果 NSString
方法可以执行指针比较而不是内容比较,我们将决定何时公开 string
,以及何时破例公开 NSString
。
当 Objective-C API 使用公共 NSString
常数作为表示某个操作的令牌,而不是比较字符串的实际内容时,可能会发生这种情况。
在这些情况下,将公开 NSString
API,有少数 API 具有此属性。 你还会注意到,在某些类中公开了 NSString 属性。 对于通知之类的项,这些 NSString
属性都是公开的。 这些属性通常如下所示:
class Foo {
public NSString FooNotification { get; }
}
当你想要注册由运行时广播的特定事件时,通知是用于 NSNotification
类的键。
这些键通常类似于:
class Foo {
public NSString FooBarKey { get; }
}
在 API 中公开 NSString
的另一个场景是作为令牌,用作在 iOS 或 OS X 中将 NSDictionary
对象作为参数的某些 API 的参数。 字典通常包含 NSString
键。 按照惯例,Xamarin.iOS 通过添加“键”名称来命名静态 NSString
属性。