Почему другое поведение? Это просто недосмотр или есть какое-то намеренное поведение, которого я не понимаю?
Потому что много лет go кто-то решил вот так ArrayList
должен себя вести!
Add()
возвращает индекс, по которому аргумент был вставлен в список, что действительно может быть полезно и имеет смысл.
С другой стороны, AddRange()
не сразу понятно, почему он должен что-либо возвращать, и если да, что ? Индекс элемента first во входных аргументах? последний ? Или он должен возвращать массив переменного размера со всеми индексами вставки? Это было бы неловко! Поэтому, кто бы ни внедрил ArrayList
, он решил вообще ничего не возвращать.
В C#
или VB.NET
, для которых изначально был разработан ArrayList
, "загрязнение трубопровода" на самом деле не существует как Согласно этой концепции, среда выполнения просто не будет копировать возвращаемое значение обратно вызывающей стороне, если кто-то вызывает .Add()
без присвоения переменной.
[void]
здесь не требуется, но мне интересно, это просто лучшая практика иметь его, в зависимости, конечно, от ответа выше. Или я что-то там тоже пропускаю?
Нет, это совершенно не нужно. AddRange()
не волшебным образом однажды изменится на вывод чего-либо.
Если вам никогда не нужно знать индекс вставки, используйте вместо него [System.Collections.Generic.List[psobject]]
:
$list = [System.Collections.Generic.List[psobject]]::new()
# this won't return anything, no need for `[void]`
$list.Add(123)
Если по какой-то причине вы должны использовать ArrayList
, вы можете "замолчать", переопределив метод Add()
:
function New-SilentArrayList {
# Create a new ArrayList
$newList = [System.Collections.ArrayList]::new()
# Create a new `Add()` method, then return the list
$newAdd = @{
InputObject = $newList
MemberType = 'ScriptMethod'
Name = 'Add'
Value = {param($obj) $this.AddRange(@($obj))}
}
Write-Output $(
Add-Member @newAdd -Force -PassThru
) -NoEnumerate
}
Теперь ваши ArrayList
Add()
никогда больше не будут пискать!
PS C:\> $list = New-SilentArrayList
PS C:\> $list.Add(123)
PS C:\> $list
123