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

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

Console.WriteLine("Hello, World");

И, если вы установили 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, с которого я начинаю в этом примере, пока я не дойду до окончательного закрытия изогнутой скобки):

> class Customer {
. public string firstName {get; set;}
. public string lastName {get; set; }
. public string fullName() {
. return firstName + " " + lastName;
. }
. }

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

> Customer cust = new Customer();
> cust.firstName = "Peter";
> cust.lastName = "Vogel";
> string fname = cust.fullName();

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

> fname
"Peter Vogel"

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

csi <name of your script file>.csx

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

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

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

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

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

CustomerRepo cr = new CustomerRepo();
Customer cust = cr.GetCustomer("A123");
string fName = cust.GetFirstName();

Еще более полезным является окно 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 является самым простым решением. Это может быть неочевидно, потому что код для этого для типичного проекта выглядит примерно так:

ReferencePaths.Add(@"C:\Users\<user name>\Source\Repos\<solution name>\<project name>\bin\debug\");

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

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

> #r "<project name>.dll"
> using <project namespace>;

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

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

#load "C:\Users\peter\Source\Repos\SampleClassLibrary\SampleClassLibrary\ExerciseAddCustomer.csx"

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

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

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

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

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

#reset core

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