tl; dr
Ваша модификация $myArgs
может быть упрощена следующим образом:
$myArgs = $args + '-pp' + $env:NOTEPAD_HOME
С массивом в качестве LHS, оператор +
выполняет объединение , т. Е. Он добавляет к массиву, хотя следует отметить, что добавление означает, что в процессе создается массив new , учитывая, что массивы являются структурами данных фиксированного размера в. NET.
Тот факт, что массив new неявно создается в любом случае, делает ненужным вызов .Clone()
в вашем коде.
Справочная информация
Обычно - и в случае automati c $args
переменная - метод .Clone()
является реализацией System.ICloneable
интерфейс .
Цель .Clone()
- создать копию (клон) объекта, но - как ответ связан с BACON объясняет - семантика этой операции - неглубоко (см. Ниже) против глубины копирование - не предписано, поэтому использование System.ICloneable
обычно не рекомендуется .
$args
- это массив ( System.Array
), а для массивов .Clone()
создает так называемую мелкую копию. То есть, как элементы массива копирование зависит от того, являются ли они экземплярами типов значений или ссылок типов:
для элементов значения элементов новый массив будет иметь независимую копию данных элементов исходного массива.
для элементов ссылочного типа , новый массив будет иметь копию ссылки элементов исходного массива, что означает, что элементы обоих массивов указывают на одинаковые данные (объекты).
Для получения дополнительной информации о типах значений и ссылочных типах см. этот ответ .
PowerShell неявно клонирует массивы в Способ описан при использовании +=
и +
.