Bagikan melalui


Cara: Mengakses Karakter dalam Sistem::String

Anda dapat mengakses karakter String objek untuk panggilan berkinerja tinggi ke fungsi tidak terkelola yang mengambil wchar_t* string. Metode ini menghasilkan penunjuk interior ke karakter String pertama objek. Pointer ini dapat dimanipulasi secara langsung atau disematkan dan diteruskan ke fungsi yang mengharapkan string biasa wchar_t .

Contoh

PtrToStringCharsCharmengembalikan , yang merupakan penunjuk interior (juga dikenal sebagai byref). Dengan demikian, itu tunduk pada pengumpulan sampah. Anda tidak perlu menyematkan pointer ini kecuali Anda akan meneruskannya ke fungsi asli.

Mempertimbangkan kode berikut. Penyematan tidak diperlukan karena ppchar merupakan penunjuk interior, dan jika pengumpul sampah memindahkan string yang dirujuknya, itu juga akan memperbarui ppchar. Tanpa pin_ptr (C++/CLI), kode akan berfungsi dan tidak memiliki potensi temuan performa yang disebabkan oleh penyematan.

Jika Anda meneruskan ppchar ke fungsi asli, maka itu harus menjadi penunjuk penyematan; pengumpul sampah tidak akan dapat memperbarui pointer apa pun pada bingkai tumpukan yang tidak dikelola.

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

Contoh ini menunjukkan di mana penyematan diperlukan.

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

Penunjuk interior memiliki semua properti pointer C++ asli. Misalnya, Anda dapat menggunakannya untuk memandu struktur data tertaut dan melakukan penyisipan dan penghapusan hanya menggunakan satu penunjuk:

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

Baca juga

Menggunakan interop C++ (PInvoke implisit)