如何:存取 System::String 中的字元
您可以存取 物件的字元,以對接受wchar_t*
字串的非String受控函式進行高效能呼叫。 方法會產生物件第一個字元的內部 String 指標。 此指標可以直接操作或釘選,並傳遞至預期一般 wchar_t
字串的函式。
範例
PtrToStringChars
會傳Char回 ,這是內部指標(也稱為 )。byref
因此,它受限於垃圾收集。 除非您要將指標傳遞至原生函式,否則不需要釘選此指標。
請考慮下列程式碼: 因為 是內部指標,所以不需要 ppchar
釘選,而且如果垃圾收集行程將它指向的字串,它也會更新 ppchar
。 如果沒有pin_ptr(C++/CLI),程式代碼將會運作,而且不會因為釘選而造成潛在的效能命中。
如果您傳遞 ppchar
至原生函式,則它必須是釘選指標;垃圾收集行程將無法更新 Unmanaged 堆疊框架上的任何指標。
// 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
此範例顯示需要釘選的位置。
// 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
內部指標具有原生C++指標的所有屬性。 例如,您可以使用它來逐步執行連結的數據結構,並且只使用一個指標進行插入和刪除:
// 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
}
}