2

質問自体に飛び込む前に、私がここで食物連鎖全体を管理しているわけではないことを理解してください。特定のAPIに対して開発する必要があるため、「あなたは間違ったことをしている」という種類の回答やコメントは役に立ちません.

生データのチャンクを通信するコンポーネントは、ほとんどの場合、byte[]またはタイプのバッファを介して通信しますArraySegment<byte>。後者には、大きなバッファーを一度だけ割り当ててから、ArraySegment メカニズムを介してその一部を使用して、メモリ割り当て、断片化、および GC の問題を軽減できるという大きな利点があります。ここには新しいものはありません。

ただし、これには代償が伴います: を消費する (おそらく外部のクローズドソースの) コンポーネントArraySegment<byte>は完全な配列への参照 (したがってアクセス) を取得します。

今:

  • 広範な検索により、既存の配列の一部のみを完全な配列として公開するメカニズムが明らかになりませんでした。この SO の質問は、私が得た最も近いものでしたが、「配列ではない」ため、まだ使用できません。
  • からの継承System.Arrayはサポートされていません。
  • からの継承System.ArraySegment<T>もサポートされていません。

私の一連の質問は次のとおりです(1つに答えると後の質問は時代遅れになります):

  • 自己開発したラッパーをbyte[](外国の)消費者に提示する「トリッキーな」方法はありますか
  • ArraySegment<byte>または、完全な基礎となる配列を公開しない、自己開発のラッパーを(外部の)消費者に提示する「トリッキーな」方法はありますか
  • System.Arrayまたは、私が見逃したから継承する方法はありますか
  • byte[]繰り返しますが、既に割り当てられている(そして固定されている)メモリ領域から作成する方法はありますか?

編集:

私が受け取ったコメントからすると、私はそれを十分に表現していませんでした。データを前後にコピーすることは解決策ではありません。今でも使っている松葉杖です。

4

1 に答える 1

0

編集:明確にするために、あなたのオプションは

  • 外部ライブラリをハードコーディングしないように書き直しますT[]/ArraySegment<T>
  • バッファをセグメント化する別の方法を選択して、外部ライブラリへの呼び出しがバッファサイズと自然に一致するようにします
  • サイズが大きすぎるバッファが、外部コードによる破損に対して脆弱な追加データを公開することを受け入れます
  • データをコピーする

編集2:間違いなく残す

自己開発したラッパーをbyte[]として(外国の)消費者に提示する「トリッキーな」方法はありますか?

いいえ、これはできません。

または、自己開発したラッパーをArraySegmentとして(外部の)コンシューマーに提示する「トリッキーな」方法があります。これは、基になる配列全体を公開しません。

いいえ、これはできません。

あるいは、私が見逃したSystem.Arrayから継承する方法はありますか

いいえ、これはできません。

もう一度言い換えると、私が見逃した、割り当てられた(そして固定された)メモリ領域からbyte []を作成する方法はありますか?

いいえ、これはできません。


外部APIを変更せずに、これは元の答えになります。

配列の使用に行き詰まり、他のコードが許可された範囲外の配列のセクションにアクセスするのを防ぎたい場合は、次のことを行う必要があります。

T[] originalData = ...;
int viewStart = ...;
int viewLength = ...;

// use a separate array for the viewable region
T[] view = new T[viewLength];
Array.Copy(originalData, viewStart, view, 0, viewLength);
ArraySegment<T> segment = new ArraySegment<T>(view).

// call other code
...

// apply changes
Array.Copy(view, 0, originalData, viewStart, viewLength);

これらは、APIデザイナーがの代わりにT[]/を使用することを選択したために課せられた制限です。ArraySegment<T>IList<T>

于 2013-03-22T15:07:14.837 に答える