一只甜甜圈
这似乎不是一个有据可查的事情。我也不知道更多细节以及它是如何工作的,但是看看CodeProject上的这个线程。该方法似乎位于 comstring.cpp 中。不幸的是,该线程中链接的帖子不再可用。这可能是一个有趣的。编辑:在 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