1 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
這似乎不是一個(gè)有據(jù)可查的事情。我也不知道更多細(xì)節(jié)以及它是如何工作的,但是看看CodeProject上的這個(gè)線程。該方法似乎位于 comstring.cpp 中。
不幸的是,該線程中鏈接的帖子不再可用。這可能是一個(gè)有趣的。
編輯:在 github 上找到完整的源代碼。
/*==================================PadHelper===================================
**Action:
**Returns:
**Arguments:
**Exceptions:
==============================================================================*/
FCIMPL4(Object*, COMString::PadHelper, StringObject* thisRefUNSAFE, INT32 totalWidth, CLR_CHAR paddingChar, CLR_BOOL isRightPadded)
{
CONTRACTL {
DISABLED(GC_TRIGGERS);
THROWS;
MODE_COOPERATIVE;
SO_TOLERANT;
} CONTRACTL_END;
STRINGREF refRetVal = NULL;
STRINGREF thisRef = (STRINGREF) thisRefUNSAFE;
HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB_1(Frame::FRAME_ATTR_RETURNOBJ, thisRef);
//-[autocvtpro]-------------------------------------------------------
WCHAR *thisChars, *padChars;
INT32 thisLength;
if (thisRef==NULL) {
COMPlusThrow(kNullReferenceException, L"NullReference_This");
}
RefInterpretGetStringValuesDangerousForGC(thisRef, &thisChars, &thisLength);
//Don't let them pass in a negative totalWidth
if (totalWidth<0) {
COMPlusThrowArgumentOutOfRange(L"totalWidth", L"ArgumentOutOfRange_NeedNonNegNum");
}
//If the string is longer than the length which they requested, give them
//back the old string.
if (totalWidth<thisLength) {
refRetVal = thisRef;
goto lExit;
}
if (isRightPadded) {
refRetVal = NewString(&(thisRef), 0, thisLength, totalWidth);
padChars = refRetVal->GetBuffer();
for (int i=thisLength; i<totalWidth; i++) {
padChars[i] = paddingChar;
}
refRetVal->SetStringLength(totalWidth);
_ASSERTE(padChars[totalWidth] == 0);
} else {
refRetVal = NewString(totalWidth);
INT32 startingPos = totalWidth-thisLength;
padChars = refRetVal->GetBuffer();
// Reget thisChars, since if NewString triggers GC, thisChars may become trash.
RefInterpretGetStringValuesDangerousForGC(thisRef, &thisChars, &thisLength);
memcpyNoGCRefs(padChars+startingPos, thisChars, thisLength * sizeof(WCHAR));
for (int i=0; i<startingPos; i++) {
padChars[i] = paddingChar;
}
}
lExit: ;
//-[autocvtepi]-------------------------------------------------------
HELPER_METHOD_FRAME_END();
return OBJECTREFToObject(refRetVal);
}
FCIMPLEND
- 1 回答
- 0 關(guān)注
- 119 瀏覽
添加回答
舉報(bào)