Saya memiliki kode C# yang berinteraksi dengan kode C++, yang melakukan operasi dengan string.
Saya memiliki potongan kode ini di kelas pembantu statis:
internal static unsafe byte* GetConstNullTerminated(string text, Encoding encoding)
{
int charCount = text.Length;
fixed (char* chars = text)
{
int byteCount = encoding.GetByteCount(chars, charCount);
byte* bytes = stackalloc byte[byteCount + 1];
encoding.GetBytes(chars, charCount, bytes, byteCount);
*(bytes + byteCount) = 0;
return bytes;
}
}
Seperti yang Anda lihat, ia mengembalikan pointer ke byte yang dibuat dengan kata kunci stackalloc
.
Namun dari Spesifikasi C# 18.8:
Semua blok memori yang dialokasikan tumpukan yang dibuat selama eksekusi anggota fungsi secara otomatis dibuang ketika anggota fungsi tersebut kembali.
Apakah ini berarti penunjuk sebenarnya tidak valid segera setelah metode kembali?
Penggunaan metode saat ini:
byte* bytes = StringHelper.GetConstNullTerminated(value ?? string.Empty, Encoding);
DirectFunction(NativeMethods.SCI_SETTEXT, UIntPtr.Zero, (IntPtr) bytes);
Haruskah kodenya diubah menjadi
...
int byteCount = encoding.GetByteCount(chars, charCount);
byte[] byteArray = new byte[byteCount + 1];
fixed (byte* bytes = byteArray)
{
encoding.GetBytes(chars, charCount, bytes, byteCount);
*(bytes + byteCount) = 0;
}
return byteArray;
Dan gunakan fixed
lagi pada array yang dikembalikan, untuk meneruskan pointer ke metode DirectFunction
?
Saya mencoba meminimalkan jumlah penggunaan fixed
(termasuk pernyataan fixed
dalam kelebihan beban lainnya pada GetByteCount()
dan GetBytes()
dari Encoding
).
tl;dr
Apakah penunjuknya tidak valid segera setelah metode kembali? Apakah tidak valid saat diteruskan ke
DirectFunction()
?Jika demikian, apa cara terbaik untuk menggunakan pernyataan
fixed
paling sedikit untuk mencapai tugas tersebut?