2015-07-24 2 views
4

Может кто-нибудь объяснить, пожалуйста, почему у нас разные поведения, когда мы работаем с хэш-таблицами?powershell hashtable манипуляция

Фактически, когда значение представляет собой простой тип (целое число, строка ...) или тип объекта, поведение отличается. Когда мы работаем с простым типом, и мы влияем на значение переменной и обновляем ее; это не будет обновлять хеш-таблицу. Но когда мы работаем с типом объекта, мы влияем на значение переменной и обновляем ее; это обновит хеш-таблицу.

Это будет легче понять с помощью примера ^^.

Простой тип:

[email protected]{ 
    a=1 
    b=2 
} 
$variable = $hash['a'] 
$variable = 3 

Result: $hash 
Name       Value 
----       ----- 
a        1 
b        2 

Тип объекта:

[email protected]{ 
    a=New-Object PSObject -Property @{ obj=1 } 
    b=New-Object PSObject -Property @{ obj=2 } 
} 
$variable = $hash['a'] 
$variable.obj = 3 

Result: $hash 
Name       Value 
----       ----- 
a        @{obj=3} 
b        @{obj=2} 

ответ

7

Это потому, что вы используете reference types и value types.

Тип объекта:

$variable = $hash['a'] 
$variable.obj = 3 

Здесь вы получите ссылку на объект, а затем свойство доступа внутри объекта.

Простой тип:

$variable = $hash['a'] 
$variable = 3 

Здесь вы копируете всю Int к новой переменной. Поэтому, когда переменная обновляется, она обновляется независимо, не влияя на хэш-таблицу. Чтобы обновить значение хэш-таблицы, вы должны использовать $hash['a'] = 3

Отъезд difference between reference types and values types.

Редактировать: string является особенным, потому что он сохраняется в куче со ссылкой, но ведет себя как тип значения. Поэтому он копируется при назначении новой строке и ведет себя как пример int.

+1

Очень хорошее объяснение. Довольно уверенно, что поведение строк типа типа похоже на то, что они неизменяемы во время выполнения –

Смежные вопросы