Delen via


Hoe toegang te krijgen tot tekens in een System::String

U hebt toegang tot tekens van een String object voor krachtige aanroepen naar niet-beheerde functies die tekenreeksen gebruiken wchar_t* . De methode geeft een interne aanwijzer naar het eerste teken van het String object. Deze aanwijzer kan rechtstreeks worden bewerkt of vastgemaakt en doorgegeven aan een functie die een gewone wchar_t tekenreeks verwacht.

Voorbeelden

PtrToStringChars retourneert een Char, een binnenaanwijzer (ook wel bekend als een byref). Als zodanig is het onderworpen aan garbagecollection. U hoeft deze aanwijzer niet vast te leggen, tenzij u deze doorgeeft aan een systeemeigen functie.

Houd rekening met de volgende code. Vastmaken is niet nodig omdat ppchar een binnenaanwijzer is, en als de garbagecollector de tekenreeks verplaatst waarnaar hij wijst, zal ppchar ook worden bijgewerkt. Zonder een pin_ptr (C++/CLI) zal de code werken zonder het mogelijke prestatieverlies dat door het vastmaken wordt veroorzaakt.

Als u een systeemeigen functie doorgeeft ppchar , moet het een vastmakende aanwijzer zijn. De garbagecollector kan geen aanwijzers in het onbeheerde stackframe bijwerken.

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

In dit voorbeeld ziet u waar vastmaken nodig is.

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

Een binnenaanwijzer heeft alle eigenschappen van een systeemeigen C++-aanwijzer. U kunt deze bijvoorbeeld gebruiken om een gekoppelde gegevensstructuur te doorlopen en invoegingen en verwijderingen uit te voeren met slechts één aanwijzer:

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

Zie ook

C++ Interop gebruiken (impliciete PInvoke)