Добавление часов без полного пространства имен в Visual Studio
Я добавляю фрагмент кода в окно просмотра из кода во время выполнения, копируя его из кода и добавляя его в окно просмотра. Если код содержит метод типа Convert.ToString (), XMLDocument.загрузить файл.Записать() и т. д. из пространства имен .NET по умолчанию, таких как System.IO, система.XML и т. д., то он выдает ошибку: "имя ' Convert' не существует в текущем контексте", но он не выдает ошибку, когда я добавляю полное пространство имен к добавленному фрагменту кода в окне просмотра, например: Система.Преобразовать.ToString (123) дает правильное значение. Код моей программы не имеет полного пространства имен перед любым методом .NET framework, вызываемым в нем, потому что если я добавляю пространство имен перед вызовом любого метода, то какой смысл добавлять пространство имен поверх каждого файла с помощью ключевого слова "using". Если я добавляю пространство имен над кодом в файле, то мне не нужно добавлять целое пространство имен в код этого файла перед вызовом метода. Что я могу сделать, кроме добавления полного пространства имен в окно просмотра каждый раз, когда я копирую код к списку наблюдения, так что часы не дают ошибки. Смотрите скриншот ниже:
Update: я добавляю метод в список наблюдения, чтобы проверить результат метода перед его выполнением. Это гарантирует, что выполнение метода не даст никаких ошибок или исключений при выполнении, и я могу редактировать код, потому что метод фактически не был выполнен в выполнении кода программы. Я ставлю точку останова на вызывающем коде этого метода и добавляю этот код в окне просмотра сначала к проверьте, нет ли ошибки, потому что если я этого не сделаю, то мне придется снова запустить всю программу, чтобы исправить значение в следующий раз.
1 ответ:
Отладчик использует контекст, в котором находится указатель текущей инструкции (маленькая желтая стрелка слева от исходного окна), чтобы попытаться оценить функцию.
Поэтому, если строка кода, в которой вы остановились, имеет "using System;" в верхней части файла, вы должны иметь возможность ввести Convert.ToInt32 (123) в окно наблюдения. Если вы находитесь в другом файле, который не имеет этого использования, вам придется полностью квалифицировать имя.
Я попробовал это со следующим тестом корпус:
// Main.cs using System; namespace TestCon { class Program { static void Main(string[] args) { Foo foo = new Foo(); Console.WriteLine(Convert.ToString(123)); Console.WriteLine(Convert.ToInt32("234")); } } } //Foo.cs (note that there are no using statements in this file) namespace TestCon { class Foo { public Foo() { } } }
Если я шагну к какой-либо точке в main.cs file я могу скопировать выражения Convert в окно watch без квалификатора пространства имен System, и они будут оцениваться. Если я шагаю в (или бегу к точке останова) в моем конструкторе Foo (), я получаю ошибку "имя 'Convert' не существует в текущем контексте", если я не добавлю в начало квалификатор пространства имен System.
Примечание: даже когда выражение может быть вычислено, вам в конечном итоге придется нажать кнопку обновить (два стрелки в круге справа от окна наблюдения) часто потому, что отладчик не может сказать, вызовет ли вызов среды CLR побочные эффекты.
Надеюсь, это поможет.