Я перестраиваю библиотеку, запрограммированную на С#, и нуждаюсь в помощи с оператором Switch
, у меня есть следующий фрагмент кода, использующий <PrivateImplementationDetails>.ComputeStringHash()
сгенерированную во время компиляции. Мой вопрос: какова функция, которую я должен использовать? sss.GetHashCode()
ли я тот же результат с помощью sss.GetHashCode()
?
В настоящее время ошибка, представленная мне, не Can not resolve symbol 'PrivateImplementationDetails'
.
switch (<PrivateImplementationDetails>.ComputeStringHash(sss)) {
case 0x1315fc:
if (sss == "ASD") {
break;
}
goto Label_0105;
case 0x15c3dc:
if (sss == "JKL") {
break;
}
goto Label_0105;
}
В то время, когда задавался вопрос, генерируемый ИЛ был относительно новым, поэтому декомпиляторы не обновлялись для его поддержки. По сути декомпилятор обнаружил некоторые из базового кода платформы.NET и хэш-функцию, используемую для поддержки операторов строковых коммутаторов.
Теперь, через год или около того, декомпиляторы были обновлены, поэтому они должны просто показать оператор switch
следующим образом:
switch (sss)
{
case "ASD":
// do something
break;
case "JKL":
// do something
break
}
Я тестировал это с помощью DotPeek и могу подтвердить, что это правильно показывает.
Этот код ниже является правильным для запуска вашего кода без каких-либо ошибок:
internal sealed class PrivateImplementationDetails
{
internal static uint ComputeStringHash(string s)
{
uint num = new uint();
if (s != null)
{
num = 0x811c9dc5;
for (int i = 0; i < s.Length; i++)
{
num = (s[i] ^ num) * 0x1000193;
}
}
return num;
}
}
И удалите <>
вокруг PrivateImplementationDetails
switch (sss) { case "ASD": etc }
. Генерация хеша делает это намного быстрее.sss.GetHashCode()
вместо перекодирования переключателя (переключатель очень длинный), это будет работать? Спасибо