Тестовые проекты дают вам возможность протестировать свой код, чтобы убедиться, что он работает, но они также являются частью «постоянной записи» вашего проекта. Если все, что вам нужно, это попробовать что-нибудь с помощью одноразового кода, сценарии C # в Visual Studio могут быть полезны.

Сценарии C # (далее CS-Script) позволяют писать и выполнять отдельные строки кода C # без необходимости определять классы или пространства имен. Этот оператор сам по себе является отличным сценарием CS-Script (и в правильной среде даже отобразит «Hello, World»):

[pastacode lang=»c» manual=»Console.WriteLine(%22Hello%2C%20World%22)%3B» message=»» highlight=»» provider=»manual»/]

И, если вы установили Visual Studio, то у вас уже есть отличная среда CS-Script: CSI.EXE (я нашел свою копию в C: \ Users \ <имя пользователя> \ Source \ ExchangeControl.WebService \ bin \ roslyn ). Вы можете создать командную среду CS-Script, просто открыв командную строку разработчика для Visual Studio и набрав CSI. Как только в окне повторно отобразится командная строка, вы можете начать ввод и выполнение CS-Script.

Вы не ограничены одиночными операторами C # с применением CSI: операторы, которые вы вводите в среду CSI, основываются на предыдущих операторах, которые вы ввели. Следующие операторы, вводимые один за другим, будут работать вместе, например, для создания класса Customer (среда CSI определяет, когда вы завершаете строку, и продолжает расширять класс Customer, с которого я начинаю в этом примере, пока я не дойду до окончательного закрытия изогнутой скобки):

[pastacode lang=»c» manual=»%3E%20class%20Customer%20%7B%0A.%20public%20string%20firstName%20%7Bget%3B%20set%3B%7D%0A.%20public%20string%20lastName%20%7Bget%3B%20set%3B%20%7D%0A.%20public%20string%20fullName()%20%7B%0A.%20return%20firstName%20%2B%20%22%20%22%20%2B%20lastName%3B%0A.%20%7D%0A.%20%7D» message=»» highlight=»» provider=»manual»/]

Теперь я могу воспользоваться этим объектом Customer с помощью еще нескольких операторов CS-Script:

[pastacode lang=»c» manual=»%3E%20Customer%20cust%20%3D%20new%20Customer()%3B%0A%3E%20cust.firstName%20%3D%20%22Peter%22%3B%0A%3E%20cust.lastName%20%3D%20%22Vogel%22%3B%0A%3E%20string%20fname%20%3D%20cust.fullName()%3B» message=»» highlight=»» provider=»manual»/]

Если ввести просто выражение (некоторая комбинация операторов, членов, переменных и значений, которые сводятся к одному значению), среда вернет мне это значение:

[pastacode lang=»c» manual=»%3E%20fname%0A%22Peter%20Vogel%22″ message=»» highlight=»» provider=»manual»/]

Конечно, шансы, что вы введете весь этот код без ошибок малы (хотя вы можете использовать клавиши со стрелками, чтобы вернуться к более ранним автономным строкам и исправить их). В таком случае разумнее всего поместить весь ваш код в файл с расширением .csx и выполнить этот файл. Вы также можете использовать команду csi для запуска этого файла сценария, например:

[pastacode lang=»c» manual=»csi%20%3Cname%20of%20your%20script%20file%3E.csx» message=»» highlight=»» provider=»manual»/]

К сожалению, командная строка CSI не поддерживает никаких команд навигации по папкам и управления ими (например, cd, dir и т. Д.), Поэтому нет встроенного способа перехода к папке, содержащей ваш файл .csx. Марк Мичилис предоставил набор расширений для среды CSI, которые позволят вам вернуть некоторые из этих функций.

Вот еще один вариант: свяжите расширение файла .csx с CSI.EXE. Теперь вы можете запустить файл .csx, просто дважды щелкнув его в проводнике.

Сценарии C # и Visual Studio

И все это очень интересно, но именно интеграция с Visual Studio может упростить некоторые части процесса разработки кода. Наиболее очевидный пример такой интеграции появляется, когда вы щелкаете правой кнопкой мыши оператор C # в своем коде и выбираете «Выполнить в интерактивном режиме» во всплывающем меню: Visual Studio обрабатывает оператор, как если бы он был CS-Script, и выполняет его.

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

[pastacode lang=»c» manual=»CustomerRepo%20cr%20%3D%20new%20CustomerRepo()%3B%0ACustomer%20cust%20%3D%20cr.GetCustomer(%22A123%22)%3B%0Astring%20fName%20%3D%20cust.GetFirstName()%3B» message=»» highlight=»» provider=»manual»/]

Еще более полезным является окно CS-Script REPL (Read-Evaluate-Print-Loop), которое вы можете открыть, перейдя в Visual Studio View | Другой вариант меню Windows и выбор C # Interactive. Теперь в этом окне вы можете ввести код CS-Script и просто нажать клавишу <Enter>, чтобы запустить его.

Однако здесь есть пара разочарований. Возможно, имеет смысл опробовать классы и их члены из интерактивного окна. Однако то, что окно открыто в Visual Studio, когда открыто ваше решение, не означает, что окно знает что-либо о классах, определенных в текущем решении. Фактически, папка окна по умолчанию даже не является папкой вашего текущего решения (по крайней мере, в Visual Studio 2019).

Вы не полностью лишены ресурсов: для вас загружены некоторые базовые библиотеки DLL .NET и некоторые системные директивы (операторы using), выполняемые за вас при открытии окна. Это означает, например, что Console.WriteLine работает прямо из коробки. Но для чего-либо, помимо некоторых базовых библиотек классов, вам нужно будет добавить ссылки на эти библиотеки самостоятельно.

Создание сценариев тестирования

Это означает, что если вы хотите опробовать объекты в своем решении, вам необходимо (а) скомпилировать код хотя бы один раз и (б) добавить ссылку на один или несколько DDL ваших проектов. Директива CS-Script #r позволит вам ссылаться на DLL, при условии, что вы передаете директиве #r полный путь к нужной DLL или ссылаетесь на папку bin / debug через коллекцию ReferencePaths.

Я считаю, что добавление пути к файлу DLL в папки bin / debug моих проектов в ReferencePaths является самым простым решением. Это может быть неочевидно, потому что код для этого для типичного проекта выглядит примерно так:

[pastacode lang=»c» manual=»ReferencePaths.Add(%40%22C%3A%5CUsers%5C%3Cuser%20name%3E%5CSource%5CRepos%5C%3Csolution%20name%3E%5C%3Cproject%20name%3E%5Cbin%5Cdebug%5C%22)%3B» message=»» highlight=»» provider=»manual»/]

Я согласен: это не то, что вы хотите вводить более одного раза (или вообще, если на то пошло). Чтобы упростить выполнение объектов в моем проекте из интерактивного окна C #, я сначала добавляю в свой проект файл с именем utilities.csx, а затем добавляю этот оператор ReferencePaths в файл (я могу получить путь к моей папке Debug, щелкнув правой кнопкой мыши в папке в обозревателе решений и выбрав Копировать полный путь). Когда мне нужно добавить свой ссылочный путь, я просто открываю файл utilities.csx, щелкаю правой кнопкой мыши строку ReferencePaths и выбираю «Выполнить в интерактивном режиме».

После этого я могу загружать библиотеки DLL в папку Debug по имени (и устанавливать их пространства имен, чтобы не вводить текст) с помощью такого кода в интерактивном окне:

[pastacode lang=»c» manual=»%3E%20%23r%20%22%3Cproject%20name%3E.dll%22%0A%3E%20using%20%3Cproject%20namespace%3E%3B» message=»» highlight=»» provider=»manual»/]

Однако вы, вероятно, обнаружите, что запускаете одни и те же наборы кода снова и снова, когда заставляете свой код работать. Если у вас есть код сценария для работы в интерактивном окне C #, разумно скопировать этот код в другой файл .csx в вашем проекте и запустить этот файл для упражнений в ваших классах.

Чтобы запустить этот файл .csx, вы используете директиву #load CS-Script. К сожалению, директива #load также требует полного пути, на этот раз к файлу .csx. Опять же, я могу получить это полное имя файла, щелкнув правой кнопкой мыши файл .csx и выбрав «Копировать полный путь». Затем я добавляю оператор #load с этим путем к файлу utilities.csx и использую Execute в интерактивном режиме для его запуска. Типичная команда #load в моем файле utilities.csx для запуска скрипта выглядит так:

[pastacode lang=»c» manual=»%23load%20%22C%3A%5CUsers%5Cpeter%5CSource%5CRepos%5CSampleClassLibrary%5CSampleClassLibrary%5CExerciseAddCustomer.csx%22″ message=»» highlight=»» provider=»manual»/]

Хранение этого сценария в файлах .csx избавляет меня от лишнего набора текста, когда я возвращаюсь к этому проекту и хочу снова использовать этот код.

Проблемы и предупреждения

Окно C # Interactive, как и любое хорошее окно REPL, позволяет прокручивать предыдущие команды, изменять их и повторно выполнять. Это подводит меня к следующему: есть несколько мест, где привычки ваших пальцев из других окон REPL могут ввести вас в заблуждение.

В окне C # Interactive REPL использование <Стрелка вверх> не позволит вам прокручивать предыдущие команды назад: вам нужно будет использовать <Alt> + <Стрелка вверх>. Нажатие клавиши <Enter> в середине оператора не приведет к его выполнению, а вместо этого добавит в него разрыв строки: <Ctrl> + <Enter> всегда выполняет текущий оператор.

Вы можете очистить интерактивное окно с помощью значка очистки окна в строке меню интерактивного окна C # или с помощью директив #cls или #clear в самом окне. Вы можете начать новый сеанс, щелкнув значок сброса в меню окна или используя директиву #reset внутри окна. Если вы работаете с .NET Core, вы захотите использовать директиву #reset с параметром core, чтобы CS-Script понимал формат ваших DLL, например:

[pastacode lang=»c» manual=»%23reset%20core» message=»» highlight=»» provider=»manual»/]

Итак, после небольшой настройки (и файла с полезными операторами utilities.csx) CS-Script может дать вам простой способ опробовать новый код и испытать существующий код без необходимости засорять тестовые классы временными пробами.