О согласованности в языке сценариев powershell с использованием типов .NET - PullRequest
0 голосов
/ 11 декабря 2008

Если я хочу создать объект .NET в PowerShell, я напишу что-то вроде следующего:

[System.Reflection.Assembly]::LoadWithPartialName("System.Xml") | out-null"
$doc = new-object -typename System.Xml.XmlDocument"

Если я хочу вызвать статический метод .Net, я использую команду, подобную следующей строке:

$path = [System.String]::Format("{0} {1}", "Hello", "World")

Я не вижу правила, стоящего за этим. Если это работает в первом примере, почему я не могу использовать System.String.Format во втором?

Ответы [ 6 ]

3 голосов
/ 12 декабря 2008

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

Скобки также используются для приведения переменных к определенному типу

PS C:\> $i = [int]"1"
PS C:\> $i.gettype().Name
Int32
PS C:\> $j = "1"
PS C:\> $j.gettype().Name
String
PS C:\>
2 голосов
/ 11 декабря 2008

Я полагаю, что вы вводите в заблуждение типы и членов.

// type "Assembly" in the "System.Reflection" namespace
[System.Reflection.Assembly] 

// member method "LoadWithPartialName" of type "Assembly"
[System.Reflection.Assembly]::LoadWithPartialName 

// type "String" in the "System" namespace
[System.String] 

// member method "Format" of type "String"
[System.String]::Format

Работает как надо. Откуда твое замешательство?

0 голосов
/ 11 декабря 2008

В случае строки:

$doc = new-object -typename "System.Xml.XmlDocument"

скобки не нужны, поскольку аргумент -typename имеет тип string. Технически, мы могли бы назвать это так:

$doc = new-object -typename "TypeThatDoesntExsit" 

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

0 голосов
/ 11 декабря 2008

Я предполагаю, что new-object просто передает его в Activator, который ожидает имя, разделенное точкой, - powershell фактически не управляет этой частью.

0 голосов
/ 11 декабря 2008

Понятно, мой вопрос был немного запутанным.

Что я спрашивал: в чем причина этого синтаксиса с квадратными скобками и двоеточиями? Почему Microsoft не определила это так, как в C # - все разделено точками?

Вопрос возник, когда я увидел следующую строку (я действительно хотел обратить внимание):

$doc = new-object -typename "System.Xml.XmlDocument"

Очевидно, что иногда синтаксис скобок / двоеточия не нужен, так почему он вообще существует?

0 голосов
/ 11 декабря 2008

Да, то, как вы сформулировали свой вопрос, немного сбивает с толку. System.Xml.XmlDocument и System.String определены как классы, поэтому вы можете использовать new-object для каждого из них, чтобы создать объект этого конкретного типа.

То, что у вас есть «foo.bar.joe», не означает, что вы делаете что-то отличное от «abc.def». Оба являются допустимыми классами, просто случается, что они имеют разную длину / определение пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...