http://msdn.microsoft.com/en-us/library/1x308yk8.aspxDlaczego każdy statyczny ciąg "Is ..." ma przeciążenie ciągu znaków, np. IsWhiteSpace (ciąg, Int32)?
To pozwala mi na to:
var str = "string ";
Char.IsWhiteSpace(str, 6);
zamiast:
Char.IsWhiteSpace(str[6]);
Wydaje się niezwykłe, więc spojrzałem na refleksji:
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsWhiteSpace(char c)
{
if (char.IsLatin1(c))
{
return char.IsWhiteSpaceLatin1(c);
}
return CharUnicodeInfo.IsWhiteSpace(c);
}
[SecuritySafeCritical]
public static bool IsWhiteSpace(string s, int index)
{
if (s == null)
{
throw new ArgumentNullException("s");
}
if (index >= s.Length)
{
throw new ArgumentOutOfRangeException("index");
}
if (char.IsLatin1(s[index]))
{
return char.IsWhiteSpaceLatin1(s[index]);
}
return CharUnicodeInfo.IsWhiteSpace(s, index);
}
trzy rzeczy uderzyło mnie:
- Dlaczego nie warto sprawdzać limitu tylko przy górnej granicy? Rzucanie
ArgumentOutOfRangeException
, podczas gdy indeks poniżej 0 dawałby standardowy łańcuch znaków, o którym czytałem ogólne oblewanie, ale nadal nie jest jasne, co tu robi i czy jest połączony z kontrolą górnego ograniczenia. TargetedPatchingOptOutAttribute
nie występuje na innych metodachIs...(char)
. PrzykładIsLetter
,IsNumber
itp
Ah, niezły chwyt, dzięki. Ludzie powinni się tym przejmować, to się sprawdza! 'IL_0015: blt.un.s IL_0022' – weston