Udostępnij za pośrednictwem


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 byrefró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ż ppcharelement . 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)