val input = generateSequence(::readLine).joinToString("\n")
print(input)
Первая строка получает многострочный ввод из stdin и помещает его в переменную.
generateSequence
- это функция из стандартной библиотеки kotlin, пакета kotlin.sequences
, которая принимает другую функцию и вызывает ее до тех пор, пока она не вернет ноль. В конце он вернет экземпляр Sequence, то есть последовательность элементов, которые могут быть перебраны.
Часть ::readLine
- это способ передачи функции readLine
, используемой для чтения из stdin, в функцию generateSequence
. Простой вызов readLine()
без ::
вызовет ошибку компилятора, поскольку generateSequence
ожидает лямбда, а не строку.
Метод joinToString принадлежит классу Sequence. Он будет перебирать свои элементы и соединять их, используя заданный разделитель, который в данном случае представляет собой новую строку (\ n).
Finnaly во второй строке, мы просто выводим результат на стандартный вывод.
Этот форум на MSDN сообщает вам.
Form.Close ()
отправляет правильную Windows сообщения для выключения win32 окно. Во время этого процесса, если форма не отображалась модально, Dispose позвонил в форму. Удаление формы освобождает неуправляемые ресурсы, которые форма держится.Если вы выполните
form1.Show ()
илиApplication.Run (новая форма Form1 ())
, удаление будет вызываться при вызовеClose ()
.Однако, если вы выполните
form1.ShowDialog ()
чтобы показать форму модально, форма не будет утилизирован, и вам понадобится для вызоваform1.Dispose ()
самостоятельно. я верю, это единственный раз, когда ты следует беспокоиться об утилизации формы сам.
То, что у меня есть просто эксперимент с инструментами диагностики VS, я назвал это. Близко () тогда formclosing событие инициирован. Тогда, Когда я называю это. Расположите () в конце в событии Formclosing, где я располагаю много других объектов в нем, это чистит все намного намного более гладкое.
Как правило, я всегда рекомендую явно вызывать метод Dispose для любого класса, который его предлагает, либо вызывая метод напрямую, либо заключая его в блок using.
Чаще всего классы, реализующие IDisposible, делают это, потому что они обертывают некоторый неуправляемый ресурс, который необходимо освободить. В то время как эти классы должны иметь финализаторы, которые действуют как защита, вызов Dispose поможет освободить эту память раньше и с меньшими накладными расходами.
В случае объекта Form, как отметила Кира, метод Close документирован для вызова Dispose от вашего имени, поэтому вам не нужно делать это явно. Однако мне всегда казалось, что полагаться на детали реализации. Я предпочитаю всегда вызывать как Close, так и Dispose для классов, которые их реализуют, для защиты от изменений / ошибок реализации и для ясности. Правильно реализованный метод Dispose должен быть безопасным для многократного вызова.
Отсутствие вызова Close
, вероятно, обходит отправку группы сообщений Win32, которые, как можно было бы подумать, несколько важны, хотя я не могу конкретно сказать вам, почему ...
Close
имеет преимущество вызывая события (которые могут быть отменены), чтобы посторонний (к форме) мог наблюдать за FormClosing
и FormClosed
, чтобы отреагировать соответствующим образом.
Мне неясно, вызываются ли FormClosing
и / или FormClosed
, если вы просто удаляете форму, но я оставлю это вам, чтобы поэкспериментировать.