Xamarin Unified API:共享代码中的 System.Int32 等怎么样?
Xamarin Unified API: What about System.Int32 etc. in Shared Code?
我知道——例如——int
的用法,在 .NET 中是 System.Int32
,正在被 nint
的用法所取代,这使得编译器能够将代码编译为 x64 或 x32。
但是与其他应用程序共享的代码呢,比方说 Android 应用程序。据我所知,nint
等仅适用于 iOS 和 OS X,因此必须再次在该共享代码中使用 int
。
具体示例可以是链接到 Xamarin.iOS 应用程序的 PCL。
会发生什么
int Add(int one, int two)
{
return one + two;
}
来自 PCL,当在 iOS 应用程序中使用时?
现在我明白了。关键是,所有涉及本机 API 的内容都需要(由编译器)准备为 x32 或 x64 模式下的 运行。这就是 nint 等新类型的用途。
所有不涉及原生内容的东西仍然可以利用 "native .NET type system",包括 Int32。这回答了上面的示例代码如何在 PCL 中工作的问题:因为 PCL 代码永远不会依赖于本机 API,所以没关系。
int
, which in .NET is System.Int32
, is being replaced by nint
这是不正确的。 int
仍然是 32 位整数。
Apple 的一些 API(iOS 和 OSX)正在使用像 NSInteger
这样的类型。此类型在 32 位处理器上为 32 位,在 64 位处理器上为 64 位。
这在 .NET 中不存在,最接近的是 IntPtr
,这通常不是一个容易使用的类型。
在编写原始 MonoTouch 时,世界(至少是移动世界)是 32 位的,API 是使用 System.Int32
的边界。这多年来一直运作良好,但最终,64 位世界变得移动了。
这就是 Xamarin 引入 nint
(以及 nuint
和 nfloat
)的原因。这些类型将因 CPU 体系结构而异。它让我们(和你)像 Apple 定义的那样绑定 API(int
保持 int
但 NSInteger
变成 nint
)。 =25=]
至于PCL(或共享代码)你应该避免那些类型。它们并非在所有平台上都可用(即使复制了源代码,您也会错过对它们的 JIT/AOT 优化)。 IOW 唯一应该使用它的地方是在您的平台特定代码中(iOS and/or OSX)。
我知道——例如——int
的用法,在 .NET 中是 System.Int32
,正在被 nint
的用法所取代,这使得编译器能够将代码编译为 x64 或 x32。
但是与其他应用程序共享的代码呢,比方说 Android 应用程序。据我所知,nint
等仅适用于 iOS 和 OS X,因此必须再次在该共享代码中使用 int
。
具体示例可以是链接到 Xamarin.iOS 应用程序的 PCL。
会发生什么
int Add(int one, int two)
{
return one + two;
}
来自 PCL,当在 iOS 应用程序中使用时?
现在我明白了。关键是,所有涉及本机 API 的内容都需要(由编译器)准备为 x32 或 x64 模式下的 运行。这就是 nint 等新类型的用途。
所有不涉及原生内容的东西仍然可以利用 "native .NET type system",包括 Int32。这回答了上面的示例代码如何在 PCL 中工作的问题:因为 PCL 代码永远不会依赖于本机 API,所以没关系。
int
, which in .NET isSystem.Int32
, is being replaced bynint
这是不正确的。 int
仍然是 32 位整数。
Apple 的一些 API(iOS 和 OSX)正在使用像 NSInteger
这样的类型。此类型在 32 位处理器上为 32 位,在 64 位处理器上为 64 位。
这在 .NET 中不存在,最接近的是 IntPtr
,这通常不是一个容易使用的类型。
在编写原始 MonoTouch 时,世界(至少是移动世界)是 32 位的,API 是使用 System.Int32
的边界。这多年来一直运作良好,但最终,64 位世界变得移动了。
这就是 Xamarin 引入 nint
(以及 nuint
和 nfloat
)的原因。这些类型将因 CPU 体系结构而异。它让我们(和你)像 Apple 定义的那样绑定 API(int
保持 int
但 NSInteger
变成 nint
)。 =25=]
至于PCL(或共享代码)你应该避免那些类型。它们并非在所有平台上都可用(即使复制了源代码,您也会错过对它们的 JIT/AOT 优化)。 IOW 唯一应该使用它的地方是在您的平台特定代码中(iOS and/or OSX)。