О согласованности в языке сценариев powershell с использованием типов .NET

Если я хочу создать объект .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во втором?

11.12.2008 09:50:54
Если что работает в первом примере? Мне не ясно, какой бит первого примера лучше, чем во втором. В обоих случаях у вас есть [TypeName] :: MethodName.
Jon Skeet 11.12.2008 10:05:00
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

PS C:\> $i = [int]"1"
PS C:\> $i.gettype().Name
Int32
PS C:\> $j = "1"
PS C:\> $j.gettype().Name
String
PS C:\>
3
12.12.2008 02:25:47
И я думал, что у автора вопроса была концепция статических методов, потому что он явно упомянул их. +1
Tomalak 12.12.2008 10:50:18

Я считаю, что вы сбиваете с толку типов и членов здесь.

// 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

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

2
11.12.2008 10:30:06

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

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

0
11.12.2008 14:07:18

Я вижу, наверное, мой вопрос был немного запутанным.

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

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

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

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

0
11.12.2008 16:10:24
в следующий раз отредактируйте исходный вопрос. Не думайте, что stackoverflow является форумом. Ваше «разъяснение» будет внизу этого списка ответов, и никто его не увидит. Это будет сбивать с толку тех, кто приходит после.
halr9000 12.12.2008 00:49:06

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

0
11.12.2008 16:14:01

В случае линии:

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

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

$doc = new-object -typename "TypeThatDoesntExsit" 

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

0
11.12.2008 16:16:21