Ok Mam odpowiedź na jedno z moich pytań.
Z reflektorem widzę różnicę między ramami 2 i 4, które wyjaśniają mój problem z perforatorią.
public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if ((startIndex < 0) || (startIndex > this.Length))
{
throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
if ((count < 0) || (startIndex > (this.Length - count)))
{
throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
}
switch (comparisonType)
{
case StringComparison.CurrentCulture:
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);
case StringComparison.CurrentCultureIgnoreCase:
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);
case StringComparison.InvariantCulture:
return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);
case StringComparison.InvariantCultureIgnoreCase:
return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);
case StringComparison.Ordinal:
return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.Ordinal);
case StringComparison.OrdinalIgnoreCase:
return TextInfo.IndexOfStringOrdinalIgnoreCase(this, value, startIndex, count);
}
throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType");
}
Jest to kod bazowy funkcji IndexOf ram 2 (bez różnicy pomiędzy 4 i 2)
Ale w funkcji TextInfo.IndexOfStringOrdinalIgnoreCase istnieją różnice:
Framework 2:
internal static unsafe int IndexOfStringOrdinalIgnoreCase(string source, string value, int startIndex, int count)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return nativeIndexOfStringOrdinalIgnoreCase(InvariantNativeTextInfo, source, value, startIndex, count);
}
Framework 4:
internal static int IndexOfStringOrdinalIgnoreCase(string source, string value, int startIndex, int count)
{
if ((source.Length == 0) && (value.Length == 0))
{
return 0;
}
int num = startIndex + count;
int num2 = num - value.Length;
while (startIndex <= num2)
{
if (CompareOrdinalIgnoreCaseEx(source, startIndex, value, 0, value.Length, value.Length) == 0)
{
return startIndex;
}
startIndex++;
}
return -1;
}
Algorytm główny zmieniło się w ramach 2 odbierane jest nativeDll który został usunięty z ram 4. Jest dobrze wiedzieć
Czy parametry ciągu są oparte na typach znaków lub typach ciągów znaków? – ChrisBD
Parametry struny – baz