質問

従来のサードパーティ コンポーネントの P/Invoke 宣言のみを含む別のヘルパー アセンブリがある場合、アセンブリを CLS 準拠としてマークする必要がある場合、次の 2 つの方法のどちらが The Better One™ なのか疑問に思います。

  • 使用 Int32公共 アンマネージ宣言が次のような P/Invoke 宣言 unsigned int.
  • 使用 UInt32内部 アンマネージ宣言が次のような P/Invoke 宣言 unsigned int, で包みます。 公共 を使用するメソッド Int32 そしてそれをに変換します UInt32 に電話するとき 内部 方法。

これらの長所と短所は何ですか?

役に立ちましたか?

解決

P/Invoke マーシャラーは、uint が大きくなりすぎても文句を言いません。最終的には負の int になるだけです。追加のレイヤーを使用すると、 チェック済み OverflowException を生成するキーワード。これはかなり望ましいことです。

手間をかける価値があるかどうかは二の次の問題です。Win32 などの多くの API は、署名なしを 論理的な 制約。文字列の長さやメモリ ブロックのサイズと同様、負の値になることはありません。実際には、このような数値がオーバーフローすることはありません。それほど多くのメモリを割り当てることができないためです。uint を使用する必要があるという完全な API を一度実行した覚えがありません。そのため、int を使用した直接の pinvoke 宣言を使用するだけで問題ないと思います。

他のヒント

Option 1を使用した場合、正しい動作が得られるとは思いません。INT32は2,147,483,647だけしかできません。一方、署名されていないINTは4,294,967,295に上がります。あなたが20億を超える価値を必要としないことを知っている限り、それは本当に重要ではありません。しかし、技術的には正しいために、パブリックインターフェイスはより大きなタイプを公開し、境界チェックを実行して、署名されていないINTに適合し、そうでない場合は例外をスローする必要があります。 INT64は(9,223,372,036,854,775,807)を行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top