在MonoTouch中使用Dictionary

时间:2012-10-29 00:25:39

标签: ios dictionary xamarin.ios aot

我对MonoTouch字典限制非常困惑:http://docs.xamarin.com/ios/about/limitations#Value_types_as_Dictionary_Keys

我理解这样的代码不允许

var foo = new Dictionary<int, int>();

但我看到这样的书中的代码,这没有意义:

protected Dictionary<int, CustomCellController> _cellControllers = new Dictionary<int, CustomCellController>();

另外,有人发布如果您使用可空类型,它会将值转换为引用,以便以下工作(只要键不为空):

var foo = new Dictionary<int?, int?>();

这也没有意义,因为可空类型是值类型的结构。

那么在设备上使用词典的真正规则是什么?

1 个答案:

答案 0 :(得分:2)

由于设备上不允许使用JITin,因此必须使用AOT(提前)编译器编译所有代码。

  

我理解不允许这样的代码:

这个限制是关于AOT编译器确定在运行时将使用什么的困难。这样的代码可能会起作用,你会在样本中看到这样的代码 - 但它也会失败,这取决于你对代码的处理方式(创建Dictionary不是问题)。

  

那么在设备上使用词典的真正规则是什么?

使用值类型意味着无法共享生成的代码(就像引用类型一样)。例如。对Dictionaryint使用通用long需要单独的代码,而stringCustomCellController可以共享相同的代码。

找出Dictionary<int,int>需要的不是问题(很明显)。然而,事情往往在内部,事情变得复杂,例如确保生成正确的KeyValuePair。嵌套的泛型也很难做对。

这就是为什么第一个一般的解决方法是尝试提示 AOT编译器关于所需的内容。如果AOT编译器可以找到需要它来生成所需内容的代码,那么它将在运行时可用。

下一个解决方法是尝试使用引用类型(例如string)而不是值类型(因为这种情况对于AOT编译器来说更容易处理)。

最后,AOT编译器越来越好(每个版本),并继续减少此(和其他)限制。所以你在这里读到的内容可能不适用于3,6,12个月......