当我在.NET源代码中寻找以下源代码时,我没有找到PadLeft
和PadRight
中的方法PadHelper
的源代码。
我的搜索是否有问题?
[System.Security.SecuritySafeCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern String PadHelper(int totalWidth, char paddingChar, bool isRightPadded);
答案 0 :(得分:3)
这似乎不是一个有据可查的东西。我也不知道更多细节以及它如何工作,但请看一下CodeProject上的this thread。该方法似乎位于comstring.cpp中。
很遗憾,此线程中已链接的帖子不再可用。这可能很有趣。
编辑:找到完整的源代码here on 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