C#での安全でないコードの制限は何ですか?たとえば、CまたはC ++を使用しているかのように、事実上任意のポインタキャストと算術演算を実行できますか?
4 に答える
はい。安全でない場合、すべての賭けは無効になります。
これは「安全でない」の背後にある考え方です。検証可能なタイプの「安全性」が削除され、ランタイムなしで、あるタイプのポインターから別のタイプのポインターにキャストできるため、足を撃たれることがなくなります。だから欲望-CやC++のように。
C#でさまざまなポインタータイプを使用する例を次に示します。
fixed (Byte* dstBytes = ¤tImage[0])
{
var dstBuffer = (Int64*)dstBytes;
const int blockCount = ImageSizeInBytes / sizeof(Int64);
for (var j = 0; j < blockCount; j++)
{
dstBuffer[j] = srcBuffer[j];
}
}
配列のタイプはですがByte[]
、取得した後、一度に8バイトにByte*
キャストして処理できることに注意してください。Int64*
はい、それはすべて可能です。これがMSDNの安全でないコードのチュートリアルです。
これをどのように使用するかは恐ろしい考えだと言っているすべての人にとって、そうですが、それは理由があります。つい最近、これを(初めて)使用する必要があり、を返すサードパーティのAPIを介してWebカメラデータを取得しましたByte *
。
はい、好きな場所にポインタを置くことができます。
ただし、プログラムは仮想アドレススペースで実行されているため、そのスペースに実際に存在するメモリにのみアクセスできます。つまり、他のプロセスにはアクセスできず、割り当てられていないメモリにはアクセスできません。
詳細については、次のページを参照してください。
http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
安全でないコードは、事実上すべてのプリミティブ変数(基本型)のポインターを宣言する機能を提供します。ポインタタイプ間でキャストできます。ポインタ演算はポインタ型のストレージサイズに基づいているため、ポインタにポストインクリメントまたはポストデクリメントを適用すると、アドレスがsizeof(type)だけ増加します。