Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Du kan komma åt tecken i ett String-objekt för högpresterande anrop till ohanterade funktioner som använder wchar_t*-strängar. Metoden ger en inre pekare till objektets String första tecken. Den här pekaren kan manipuleras direkt eller fästas och skickas till en funktion som förväntar sig en vanlig wchar_t sträng.
Exempel
PtrToStringChars returnerar en Char, som är en inre pekare (även kallad byref). Därför omfattas den av skräpinsamling. Du behöver inte fästa den här pekaren om du inte ska skicka den till en intern funktion.
Överväg följande kod. Fastsättning behövs inte eftersom ppchar är en inre pekare, och om skräpinsamlaren flyttar strängen som den pekar på kommer den också att uppdateras ppchar. Utan en pin_ptr (C++/CLI) kommer koden att fungera utan den potentiella prestandapåverkan som orsakas av fixeringen.
Om du skickar ppchar till en inbyggd funktion måste det vara en fast pekare. Skräpinsamlaren kan inte uppdatera några pekare på den hanteringsfria stackramen.
// 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
Det här exemplet visar var fästande behövs.
// 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
En inre pekare har alla egenskaper för en inbyggd C++-pekare. Du kan till exempel använda den för att gå över en länkad datastruktur och göra infogningar och borttagningar med bara en pekare:
// 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
}
}