Porady: dostęp do znaków w obiekcie System::String
Możesz uzyskać dostęp do znaków String obiektu w przypadku wywołań o wysokiej wydajności do funkcji niezarządzanych, które przyjmują wchar_t*
ciągi. Metoda zwraca wskaźnik wewnętrzny do pierwszego znaku String obiektu. Ten wskaźnik można manipulować bezpośrednio lub przypiąć i przekazać do funkcji oczekiwanej zwykłego wchar_t
ciągu.
Przykłady
PtrToStringChars
Zwraca element Char, który jest wskaźnikiem wewnętrznym (nazywanym byref
również ). W związku z tym podlega on wyrzucania pamięci. Nie musisz przypinać tego wskaźnika, chyba że zamierzasz przekazać go do funkcji natywnej.
Spójrzmy na poniższy kod. Przypinanie nie jest potrzebne, ponieważ ppchar
jest wskaźnikiem wewnętrznym, a jeśli moduł odśmiecania pamięci przenosi ciąg, do którego wskazuje, zaktualizuje również ppchar
element . Bez pin_ptr (C++/CLI) kod będzie działać i nie będzie miał potencjalnego trafienia wydajności spowodowanego przypinaniem.
Jeśli przejdziesz ppchar
do funkcji natywnej, musi to być wskaźnik przypinania. Moduł odśmiecania pamięci nie będzie mógł zaktualizować żadnych wskaźników w niezarządzanej ramce stosu.
// 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
W tym przykładzie pokazano, gdzie potrzebne jest przypinanie.
// 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
Wskaźnik wewnętrzny ma wszystkie właściwości natywnego wskaźnika C++. Można na przykład użyć jej do chodzenia połączonej struktury danych i wstawiania i usuwania przy użyciu tylko jednego wskaźnika:
// 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
}
}
Zobacz też
Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke)