HBITMAP
ハンドルは、操作socket
によって影響を受けるオブジェクトを識別するために使用される抽象オブジェクト (ビットマップ、ソケット、ファイル、メモリなど) の識別子ですFILE*
。オペレーティング システムのテーブルまたはマップのインデックス。
厳密に言えば、ポインタはメモリ内の正確な位置です。ポインターがハンドルとして使用されることもありますが、その逆が真になることはめったにありません。
オブジェクト指向環境では、ハンドルは低レベルのエンティティと見なされ、割り当てられたハンドルを使用して操作を呼び出すメソッドを持つオブジェクトでハンドルをオブジェクトにラップすることをお勧めします。その場合、ハンドルを保持するオブジェクトへの参照があります。たとえばCBitmap
、System.Net.Sockets.Socket
、std::fstream
、 などです。
言語の宗教戦争を掘り下げることなく、どちらか一方がよりクリーンで、より安全で、より速く、より簡単であると主張する人もいます。ほとんどの場合、使用している環境によって異なります。選択肢がある場合は、C# でハンドルを直接使用することはお勧めしませんが、C ではハンドルを使用する方がはるかに簡単 (かつ必要) です。
重要な注意: .Net 環境では、マーシャリングを行う必要がある場合、ハンドルと呼ばれる実際のオブジェクト参照について何かを読むことになります。これは、それらが実際にはポインターではなく内部のハンドルであるためです。したがって、オブジェクトのメソッドを呼び出すと、コンパイラは実際には、メモリ内を自由に移動できるオブジェクトへのハンドルを使用してメソッドを呼び出しています。これにより、ガベージ コレクタがメモリの断片化を回避できるようになります。したがって、 を使用System.Drawing.Bitmap
すると、Handle to a Pointer to a Handle になります。
編集:
例、C++ の stdio/fstream:
// Read a short line from a file and output it to the console
// 256 bytes max for simplicity purposes
char buffer[256];
// With handle
FILE* file = fopen ("file.txt" , "r");
fgets(buffer, 256 , file);
std::cout << buffer << std::endl;
fclose (file);
// With object reference
{
std::ifstream stream ("file.txt");
stream.getline(buffer, 256);
std::cout << buffer << std::endl;
}
一番上の例では、ファイルへのハンドルと見なされるものを使用しFILE*
ています。file
ハンドルは を使用して割り当てられ、やなどのfopen
操作に渡されます。ハンドルの割り当てを解除します。fgets()
close()
close()
一番下の例は を使用していstd::ifstream
ます。ハンドルはオブジェクト コンストラクターで割り当てられ、そのオブジェクトの内部にあります。ファイルに対して操作を行うには、そのオブジェクトによって提供される などのメソッドを使用しますgetline()
。オブジェクトがスコープ外になると、つまり閉じ括弧でハンドルがストリーム デストラクタによって割り当て解除されます。または、オブジェクトがヒープに割り当てられている場合は、明示的に削除する必要があります。