Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Nagy teljesítményű hívások esetén, amikor nem felügyelt String függvényeket kell sztringekkel ellátni, hozzáférhet egy wchar_t* objektum karaktereihez. A metódus egy belső mutatót ad az String objektum első karakteréhez. Ez a mutató közvetlenül vagy rögzítve módosítható, és átadható egy szokásos wchar_t sztringet váró függvénynek.
Példák
PtrToStringChars egy Charbelső mutatót (más néven byrefegy) ad vissza. Ezért szemétgyűjtésnek van alávetve. Nem kell rögzítenie ezt a mutatót, hacsak nem egy natív függvénynek fogja átadni.
Vegye figyelembe a következő kódot. A rögzítésre nincs szükség, mert ppchar egy belső mutató, és ha a szemétgyűjtő áthelyezi a karakterláncot, amelyre mutat, akkor a ppchar is frissül.
Pin_ptr (C++/CLI) nélkül a kód működni fog, és nem lesz pinning által okozott potenciális teljesítménycsökkenés.
Ha natív függvénynek ad át ppchar, annak rögzített mutatónak kell lennie; a szemétgyűjtő nem tudja frissíteni a nem kezelt veremkeret mutatóit.
// PtrToStringChars.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;
int main() {
String ^ mystring = "abcdefg";
interior_ptr<const Char> ppchar = PtrToStringChars( mystring );
for ( ; *ppchar != L'\0'; ++ppchar )
Console::Write(*ppchar);
}
abcdefg
Ez a példa bemutatja, hogy hol van szükség rögzítésre.
// PtrToStringChars_2.cpp
// compile with: /clr
#include <string.h>
#include <vcclr.h>
// using namespace System;
size_t getlen(System::String ^ s) {
// Since this is an outside string, we want to be secure.
// To be secure, we need a maximum size.
size_t maxsize = 256;
// make sure it doesn't move during the unmanaged call
pin_ptr<const wchar_t> pinchars = PtrToStringChars(s);
return wcsnlen(pinchars, maxsize);
}
int main() {
System::Console::WriteLine(getlen("testing"));
}
7
A belső mutató a Natív C++ mutató összes tulajdonságával rendelkezik. Használhatja például egy csatolt adatstruktúrát, és csak egy mutatóval végezhet beszúrásokat és törléseket:
// PtrToStringChars_3.cpp
// compile with: /clr /LD
using namespace System;
ref struct ListNode {
Int32 elem;
ListNode ^ Next;
};
void deleteNode( ListNode ^ list, Int32 e ) {
interior_ptr<ListNode ^> ptrToNext = &list;
while (*ptrToNext != nullptr) {
if ( (*ptrToNext) -> elem == e )
*ptrToNext = (*ptrToNext) -> Next; // delete node
else
ptrToNext = &(*ptrToNext) -> Next; // move to next node
}
}