Powershell: ссылка на один элемент в массиве - PullRequest
6 голосов
/ 14 июля 2020

Я хотел бы сослаться на один элемент внутри массива, используя ключевое слово [ref].

Как проверить ссылку:

$var1 = "this is a string"
[ref]$var2 = [ref]$var1

$var2.Value
this is a string

$var2.Value += " too!"
$var2.Value
this is a string too!

$var1
this is a string too!

Вышеуказанное работает должным образом . Но теперь для ссылки на единственный элемент внутри любого массива?

$var3="string 1", "string 2", "string 3"
[ref]$var2=[ref]($var3[1])

$var2.Value
string 2

$var2.Value += " updated!"
$var2.Value
string 2 updated!

$var3[1]
string 2

Я ожидал, что $var3[1] вернет то же самое, что и значение $var2.Value. Что я делаю не так?

1 Ответ

3 голосов
/ 15 июля 2020

В PowerShell, вы не можете получить ссылку на отдельные элементы массива .

Чтобы получить напишите доступ к указанному c элементу массива, ваш единственный вариант:

  • использовать ссылку на массив в целом

  • и для ссылки на интересующий элемент по индексу .

Другими словами:

Учитывая $var3 = "string 1", "string 2", "string 3", только способ изменить 2-й элемент массива, хранящегося в $var3, должен использовать $var3[1] = ... (за исключением акробатики через C# код, составленный по запросу).

Что касается того, что вы пробовали :

[ref] $var2 = [ref] ($var3[1])

В PowerShell, если вы получите значение $var3[1], это всегда копия данных, хранящихся во втором элементе $var3 (который может быть копией фактических данных, если элемент содержит экземпляр типа значения , или копию ссылки на экземпляр ссылочного типа , в противном случае).

Преобразование этой копии в [ref], следовательно, неизменно диссоциирует от исходного элемента массива.

...