2008-12-11 16 views
0

Si je veux créer un objet .NET dans le powershell j'écris quelque chose comme ce qui suit:A propos consistensy dans le langage de script PowerShell, en utilisant des types .NET

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

Si je veux appeler un .Net statique méthode J'utilise une commande similaire à la ligne suivante:

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

Je ne vois pas la règle derrière cela. Si cela fonctionne dans le premier exemple, pourquoi ne puis-je pas utiliser System.String.Format dans le second?

+0

Si * ce * fonctionne dans le premier exemple? Ce n'est pas clair pour moi quel bit du premier exemple est meilleur que dans le second exemple. Dans les deux cas, vous avez [TypeName] :: MethodName. –

Répondre

3

Les parenthèses sont utilisées lorsque vous utilisez une méthode statique sur une classe donnée. Lorsque vous instanciez un nouvel objet d'une classe particulière, vous n'avez pas besoin des crochets.

Les supports sont également utilisés pour lancer des variables à un certain type

PS C:\> $i = [int]"1" 
PS C:\> $i.gettype().Name 
Int32 
PS C:\> $j = "1" 
PS C:\> $j.gettype().Name 
String 
PS C:\> 
+0

Et je pensais que l'auteur de la question avait un concept de méthodes statiques parce qu'il les mentionnait explicitement. +1 – Tomalak

2

Je crois que vous confondez types et membres ici.

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

Cela fonctionne comme il se doit. D'où vient votre confusion?

0

Oui, la façon dont vous avez formulé votre question est un peu confuse. System.Xml.XmlDocument et System.String sont définis en tant que classes. Vous pouvez donc utiliser new-object pour chacun d'entre eux afin de créer un objet de ce type particulier. Ce n'est pas parce que vous avez "foo.bar.joe" que vous faites quelque chose de différent de "abc.def". Les deux sont des classes valides, il arrive juste qu'ils aient une longueur/définition d'espace de noms différente.

0

Je vois, probablement, ma question était un peu confuse.

Ce que je demandais est: Quelle est la raison de cette syntaxe avec les parenthèses et les deux-points? Pourquoi Microsoft ne l'a-t-il pas défini comme C# - tout est séparé par des points?

La question a été soulevée quand j'ai vu la ligne suivante (je voulais vraiment mettre l'attention sur):

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

Il est évident que, parfois la syntaxe entre parenthèses/côlon n'est pas nécessaire, alors pourquoi est-il même d'exister?

+1

la prochaine fois, éditez votre question initiale. Ne pensez pas à stackoverflow comme un forum.Votre "clarification" va être au bas de cette liste de réponses et personne ne le verra. Ce sera déroutant pour ceux qui viennent afrter. – halr9000

0

Je suppose que le nouvel objet le passe simplement à Activator, qui attend un nom délimité par des périodes - powershell ne gère pas réellement cette partie.

0

Dans le cas de la ligne:

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

les crochets ne sont pas nécessaires parce que le -typename argument est de type chaîne. Techniquement, nous pourrions l'appeler comme ceci:

$doc = new-object -typename "TypeThatDoesntExsit" 

et montrerions une erreur, car il tente de résoudre dynamiquement le type à une chaîne.