2013-12-18 2 views
2

У меня есть очень большой метод, где я пытаюсь создать больше локальных переменных, чем поддерживает .NET Framework. Примерный размер строк кода - 147000, а количество локальных переменных - около 75000. Я нашел эту статью http://support.microsoft.com/kb/919514, но здесь рассказала об этой проблеме в .net 2.0, но я использую .net 4.0 в Windows 8.1. Могу ли я увеличить ограничение локальных переменных вручную?Как увеличить предел локальных переменных

Мой проект - это простое консольное приложение, которое генерирует файл .docx.

+17

147K линий и 75K переменных? «Простое консольное приложение» - возможно, вы задаете неправильный вопрос здесь. Как правило, я бы сказал «отправлю код» ... но .... пожалуйста, не надо ;-) –

+1

как насчет рефакторинга? – Bas

+0

Какой-то «код спагетти» - это этот метод ... –

ответ

11

Вы просто сталкиваетесь с жестким ограничением в MSIL, коде, создаваемом компилятором C#. Локальная переменная загружается Opcodes.LdLoc instruction. Существует несколько вариантов этой инструкции, оптимизированных для обычных случаев. Я связан с «максимальным», он принимает 16-разрядный индекс без знака для индекса локальной переменной. Закодированный в 4 байта в MSIL:

FE 0C < unsigned int16 > 

Исправления вы нашли в том, чтобы работать вокруг джиттера ошибки, которые интерпретируют индекс как знаковое значение, а не беззнаковые один. Создание кодовой бомбы, когда метод имеет более 32767 локальных переменных.

Но, очевидно, вы никогда не сможете иметь больше, чем UInt16.MaxValue+1 индексов. Что составляет 65 536 человек. С 75 000 переменных вы превысили это ограничение.

Там нет обходного пути для этого, вы должны ограничить количество локальных переменных и держать его под 65536.

+5

+1 * «держите его ниже 65536» * - желательно * хорошо * ниже. –

1

Вам действительно нужно разбить это на более мелкие методы/классы. Это огромный файл, и в конечном итоге кому-то, кроме вас, придется его поддерживать.

Трюк заключается не в том, чтобы найти какой-то способ получить время, чтобы позволить большему количеству местных жителей, а в том, чтобы написать достойный код в первую очередь. О, и все, что этот большой не попадает в категорию «простое консольное приложение»!

+0

Да, я разбиваю на классы ~ = 5-6k переменных на каждую, но все равно имею ту же проблему. – BorHunter

+0

Если это «простое консольное приложение», мне интересно, что ОП считает «довольно сложным приложением», , не говоря уже о «чертовой сложной заявке»: D – oerkelens

+0

@BorHunter - Дело в том, что вам не может понадобиться такое количество переменных! Было бы интересно, если бы вы могли разместить небольшой самородок кода, чтобы мы могли видеть, что вы делаете. – Sean

1

Большой метод может содержать до 20 или 25 строк. Некоторые программисты скажут вам, что даже 20 строк для метода слишком много. Вы должны разделить этот метод на большое количество различных методов. Код, который вы описываете, явно плохой код и тот, который очень трудно отлаживать, понимать или исправлять.

Смежные вопросы