Что такое стандарт равенства объектов в PowerShell и как ServiceController определяет метод Equals?

1

Я попробовал эти команды в PowerShell:

$a1 = (Get-Service)
$a2 = (Get-Service)
$a1[0] -eq $a2[0]

К моему удивлению, результат ложный. Затем я дважды проверил их стоимость и обнаружил, что они одинаковые услуги.

Как два объекта, принадлежащих к одному и тому же сервису, не равны друг другу?

Каков стандарт равенства объектов в PowerShell?

Я обнаружил, что причина в том, что метод Equals в System.ServiceProcess.ServiceController Object возвращает false.

Но как система сравнивается? Это то, что я сейчас не понимаю.

Теги:
powershell
powershell-v3.0

2 ответа

2
Лучший ответ

Это не тот же объект. Они могут содержать одни и те же данные или значения, но это разные экземпляры объекта ServiceController.

Возьмем, например, следующее:

$obj = new-object pscustomobject -Property @{123=456}
$obj2 = new-object pscustomobject -Property @{123=456}

Вы ожидаете, что они будут одним и тем же объектом? Хотя они содержат одни и те же данные, это два отдельных экземпляра, поэтому $obj1 -eq $obj2 всегда будет возвращать $false

Аналогично, используя метод equals() из.NETs System.Object, из которого все наследует:

> $obj.equals($obj2)
False
  • 0
    Различные экземпляры строкового объекта могут быть одинаковыми. Так что быть одним и тем же объектом не означает быть равным в PowerShell
  • 0
    Если вы были правы, то каждые два объекта, которые не совпадают, не должны быть равны
Показать ещё 9 комментариев
0

Я нашел часть причины. Это связано с тем, что метод Equals в System.ServiceProcess.ServiceController возвращает ложное значение.

  • 0
    Это, кажется, не отвечает на ваш собственный вопрос - вы не спрашиваете, почему он возвращает false? Это не относится к этому
  • 0
    Да, я ответил на свой вопрос. Потому что почему он возвращает ложь не имеет значения. Вы можете определить класс, метод Equals которого всегда возвращает false, тогда объект не равен самому себе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню