4

ディクショナリキーとして値型を使用すると、「デバイス上でかなり速くクラッシュして書き込む」と書かれています。つまり、Dictionary <int、string>のようなものを使用して文字列ルックアップテーブルを作成することはできませんか?

4

1 に答える 1

8

辞書のキーとして値型を使用すると、「デバイス上でかなり速くクラッシュして焼き付く」と書かれています。

それはそれほど劇的ではなく(火傷なし)、またはそれほど自動ではありません-しかし、それは起こる可能性があります。

Appleは、デバイスでのJIT(ジャストインタイム)コンパイルを許可していません。これは、デバイスにデプロイする前に、すべてを(事前に)事前にコンパイルする必要があることを意味します。つまり、MonoTouchには、.NET/MonoまたはMonoforAndroidにはないいくつかの制限があります。

一般に、ジェネリックス用に生成されたコードは、異なるタイプ間で共有できます。残念ながら、これは値型では不可能です。つまり、AOT(事前)コンパイラは、使用されているすべての値型のコードを生成する必要があります。

場合によっては、AOTコンパイラは、実行時に必要になる可能性のあるすべてのタイプを検出できないことがあります。これによりEngineExecutionException、問題のあるコードを示すことができます。

この段階で、次のことを試すことができます。

  • コードが必要であることをAOTコンパイラにヒントします(つまり、AOTコンパイラが必要な欠落コードを生成するようにするコードを追加します)。また

  • コードをリファクタリングします。たとえば、値型を回避します。

それは、辞書のようなものを使用して文字列ルックアップテーブルを作成できないことを意味しますか?

いいえ、それでうまくいきます。thenのインスタンスを作成するDictionary<int, string>と、AOTコンパイラが生成する必要のあるコードを知るのは非常に簡単です。

一般に、ジェネリックをネストする場合、またはジェネリックをネストするコードを使用する場合に問題が発生します(たとえば、値型を使用したLINQクエリでそのようなコードが生成される可能性があります)。

于 2013-01-15T16:55:55.263 に答える