Dela via


Anvisningar: Komma åt tecken i ett system::Sträng

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
   }
}

Se även

Använda C++ Interop (implicit PInvoke)