Я написал довольно сложный метод, который возвращает IEnumerable, но когда я проверял выходные данные компилятора в Reflector, я не понял конкретную часть сгенерированной компилятором реализации IEnumerator:
void IDisposable.Dispose()
{
switch (this.1__state)
{
case 1:
case 2:
case 3:
switch (this.1__state) // empty switch! why?!
{
}
break;
default:
return;
try // What?! AFTER return?!
{
}
finally // is the try-finally block anyhow relevant?
{
this.m__Finallya();
}
break;
}
this.m__Finally7();
}
Я предполагаю (или надеюсь), что Reflector неправильно разместил закрывающую скобку внешнего переключателя и что она должна быть сразу после возврата. Тем не менее, я не понимаю, почему в случае 3 имеется пустой переключатель или почему m__Finallya вызывается в блокеfinally. (Есть ли семантическая разница между обычным запуском и внутри блокаfinally? Кроме CER, которого нет в моем коде.)
Для ссылка, вот IL:
.method private hidebysig newslot virtual final
instance void System.IDisposable.Dispose() cil managed
{
.override [mscorlib]System.IDisposable::Dispose
// Code size 69 (0x45)
.maxstack 2
.locals init ([0] int32 CS$0$0000,
[1] int32 CS$0$0001)
IL_0000: ldarg.0
IL_0001: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'d__0'::'1__state'
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.1
IL_0009: sub
IL_000a: switch (
IL_001c,
IL_001c,
IL_001c)
IL_001b: ret
IL_001c: ldarg.0
IL_001d: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'d__0'::'1__state'
IL_0022: stloc.1
IL_0023: ldloc.1
IL_0024: ldc.i4.2
IL_0025: sub
IL_0026: switch (
IL_0035,
IL_0035)
IL_0033: br.s IL_003e
.try
{
IL_0035: leave.s IL_003e
} // end .try
finally
{
IL_0037: ldarg.0
IL_0038: call instance void FBD.TIP.Reader.MissingMessagesReader/'d__0'::'m__Finallya'()
IL_003d: endfinally
} // end handler
IL_003e: ldarg.0
IL_003f: call instance void FBD.TIP.Reader.MissingMessagesReader/'d__0'::'m__Finally7'()
IL_0044: ret
} // end of method 'd__0'::System.IDisposable.Dispose
Подробнее здесь: https://stackoverflow.com/questions/555 ... rator-mean
Что означает этот перечислитель, созданный компилятором? ⇐ C#
Место общения программистов C#
-
Anonymous
1722121757
Anonymous
Я написал довольно сложный метод, который возвращает IEnumerable, но когда я проверял выходные данные компилятора в Reflector, я не понял конкретную часть сгенерированной компилятором реализации IEnumerator:
void IDisposable.Dispose()
{
switch (this.1__state)
{
case 1:
case 2:
case 3:
switch (this.1__state) // empty switch! why?!
{
}
break;
default:
return;
try // What?! AFTER return?!
{
}
finally // is the try-finally block anyhow relevant?
{
this.m__Finallya();
}
break;
}
this.m__Finally7();
}
Я предполагаю (или надеюсь), что Reflector неправильно разместил закрывающую скобку внешнего переключателя и что она должна быть сразу после возврата. Тем не менее, я не понимаю, почему в случае 3 имеется пустой переключатель или почему m__Finallya вызывается в блокеfinally. (Есть ли семантическая разница между обычным запуском и внутри блокаfinally? Кроме CER, которого нет в моем коде.)
Для ссылка, вот IL:
.method private hidebysig newslot virtual final
instance void System.IDisposable.Dispose() cil managed
{
.override [mscorlib]System.IDisposable::Dispose
// Code size 69 (0x45)
.maxstack 2
.locals init ([0] int32 CS$0$0000,
[1] int32 CS$0$0001)
IL_0000: ldarg.0
IL_0001: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'d__0'::'1__state'
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.1
IL_0009: sub
IL_000a: switch (
IL_001c,
IL_001c,
IL_001c)
IL_001b: ret
IL_001c: ldarg.0
IL_001d: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'d__0'::'1__state'
IL_0022: stloc.1
IL_0023: ldloc.1
IL_0024: ldc.i4.2
IL_0025: sub
IL_0026: switch (
IL_0035,
IL_0035)
IL_0033: br.s IL_003e
.try
{
IL_0035: leave.s IL_003e
} // end .try
finally
{
IL_0037: ldarg.0
IL_0038: call instance void FBD.TIP.Reader.MissingMessagesReader/'d__0'::'m__Finallya'()
IL_003d: endfinally
} // end handler
IL_003e: ldarg.0
IL_003f: call instance void FBD.TIP.Reader.MissingMessagesReader/'d__0'::'m__Finally7'()
IL_0044: ret
} // end of method 'd__0'::System.IDisposable.Dispose
Подробнее здесь: [url]https://stackoverflow.com/questions/555796/what-does-this-compiler-generated-enumerator-mean[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия