Где Visual Studio ищет txt файлы при проведении операций управления файлами?

Динамическое подключение является своего рода самомодификацией (исправляющий абсолютные и/или относительные местоположения перехода)... это обычно делается загрузчиком программы O/S, все же.

9
задан Juri 18 September 2009 в 22:37
поделиться

3 ответа

Visual Studio устанавливает рабочий каталог в YourProjectDirectory \ Debug \ Bin при работе в режиме отладки. Если ваш текстовый файл находится в YourProjectDirectory, вам необходимо учесть это различие.

Самый простой способ сделать это - включить ваши текстовые файлы в проект и установить для них действие сборки (в окне «Свойства») «Содержимое».

7
ответ дан 4 December 2019 в 14:29
поделиться

Если вы говорите о запуске кода в отладчике Visual Studio с помощью F5 или Debug / Start Debugging, вы можете установить рабочий каталог вашей программы через Project / Properties / Конфигурация / Отладка / Рабочий каталог.

Поместите текстовый файл в какой-нибудь каталог и установите Рабочий каталог так, чтобы он указывал на этот каталог.

3
ответ дан 4 December 2019 в 14:29
поделиться

Вот вам не ответ: не делайте этого. Список неизменяем, поэтому нет абсолютно никакого смысла копировать его.

Давайте рассмотрим несколько операций:

val list = List(1,2,3)
val l1 = 0 :: list
val l2 = "a" :: list

Ни l1 , ни l2 не изменяются list , но оба они создают новые списки, ссылающиеся на list .

Поясним это подробнее. Конструктор List (1,2,3) создает три элемента и также использует одноэлементный объект. В частности, он создает экземпляры этих элементов:

::(3, Nil)
::(2, reference to the previous element)
::(1, reference to the previous element)

И Nil является одноэлементным объектом. Идентификатор list указывает на последний элемент.

Теперь, когда вы назначаете 0 :: list на l1 , вы создаете один новый экземпляр объект:

::(0, reference to ::(1, etc))

Конечно, поскольку есть ' Так как ссылка на список , вы можете представить l1 как список из четырех элементов (или пяти, если считать Nil ).

Теперь ] l2 даже не относится к тому же типу списка , но ТАКЖЕ ссылается на него! Здесь:

::("a", reference to ::(1, etc))

Однако важным моментом в отношении всех этих объектов является то, что они не могут быть изменены. Нет сеттеров или каких-либо методов, которые изменяли бы какие-либо их свойства. У них всегда будут одни и те же значения / ссылки в их «голове» (это то, что мы называем первым элементом) и те же ссылки в их «хвосте» (это то, что мы называем вторым элементом).

Однако, есть методы, которые выглядят так, как будто они меняют список. Однако будьте уверены, что они создают новые списки. Например:

val l3 = list map (n => n + 1)

Карта методов создает полностью новый список того же размера, где новый элемент может быть вычислен из соответствующего элемента в списке (но вы также можете игнорировать старый элемент).

val l4 = l2 filter (n => n.isInstanceOf[Int])

Хотя l4 имеет те же элементы, что и list (но другого типа), это также совершенно новый список. Метод filter создает новый список на основе правила, которое вы передаете, чтобы сообщить ему, какие элементы входят, а какие нет. Он не пытается оптимизировать, если может вернуть существующий список.

val l5 = list.tail

Это не создает новый список. Вместо этого он просто присваивает l5 существующий элемент list .

val l6 = list drop 2

Опять же, новый список не создается.

val l7 = list take 1

Это, однако, создает новый список именно потому, что он Можно' t изменить первый элемент list так, чтобы его конец указывал на Nil .

Вот несколько дополнительных деталей реализации:

  • List - абстрактный класс. У него есть два потомка: класс :: (да, это имя класса) и одноэлементный объект Nil . Список запечатан, поэтому вы не можете добавлять в него новые подклассы, а :: является окончательным, поэтому вы не можете создать подклассы.

  • Пока вы не можете этого сделать. что угодно, чтобы изменить список, он использует изменяемое состояние внутри некоторых операций. Это помогает повысить производительность, но оно локализовано, так что ни одна программа, которую вы пишете, никогда не сможет обнаружить это или пострадать от последствий. Вы можете передавать списки по своему усмотрению, независимо от того, что с ними делают другие функции или сколько потоков используют их одновременно.

0
ответ дан 4 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: