关于powershell脚本语言中使用.NET类型的一致性

关于powershell脚本语言中使用.NET类型的一致性,.net,powershell,oop,types,.net,Powershell,Oop,Types,如果我想在powershell中创建.NET对象,我会编写如下代码: [System.Reflection.Assembly]::LoadWithPartialName("System.Xml") | out-null" $doc = new-object -typename System.Xml.XmlDocument" 如果要调用静态.Net方法,请使用类似于以下行的命令: $path = [System.String]::Format("{0} {1}", "Hello", "World

如果我想在powershell中创建.NET对象,我会编写如下代码:

[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

我相信您在这里混淆了类型和成员

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

它正在正常工作。你的困惑来自哪里?

我相信你在这里混淆了类型和成员

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

它正在正常工作。你的困惑是从哪里来的?

是的,你的问题措辞有点困惑。 System.Xml.XmlDocument和System.String被定义为类,因此您可以为它们中的每一个使用新对象来创建特定类型的对象


仅仅因为你有“foo.bar.joe”,并不意味着你在做与“abc.def”不同的事情。这两个类都是有效的类,只是碰巧它们的名称空间长度/定义不同。

是的,您的问题措辞有点混乱。 System.Xml.XmlDocument和System.String被定义为类,因此您可以为它们中的每一个使用新对象来创建特定类型的对象


仅仅因为你有“foo.bar.joe”,并不意味着你在做与“abc.def”不同的事情。这两个类都是有效的类,只是碰巧它们具有不同的名称空间长度/定义。

我知道,可能我的问题有点让人困惑

我想问的是:为什么用括号和冒号这样的语法?为什么微软没有用C语言来定义它——所有的东西都用点分隔

当我看到下面这句话时,这个问题出现了(我实际上想把注意力放在这句话上):


显然,有时不需要方括号/冒号语法,那么它为什么会存在呢?

我知道,可能我的问题有点让人困惑

我想问的是:为什么用括号和冒号这样的语法?为什么微软没有用C语言来定义它——所有的东西都用点分隔

当我看到下面这句话时,这个问题出现了(我实际上想把注意力放在这句话上):


显然,有时不需要方括号/冒号语法,那么它为什么存在呢?

我猜新对象只是将其传递给Activator,Activator需要一个以句点分隔的名称——powershell实际上并不管理该部分。

我猜新对象只是将其传递给Activator,它需要一个以句点分隔的名称--powershell实际上并不管理该部分。

对于第行:

$doc = new-object -typename "System.Xml.XmlDocument"
不需要括号,因为参数-typename的类型为string。从技术上讲,我们可以这样称呼它:

$doc = new-object -typename "TypeThatDoesntExsit" 
它将显示一个错误,因为它试图动态地将类型解析为字符串。

对于行:

$doc = new-object -typename "System.Xml.XmlDocument"
不需要括号,因为参数-typename的类型为string。从技术上讲,我们可以这样称呼它:

$doc = new-object -typename "TypeThatDoesntExsit" 

它会显示错误,因为它试图将类型动态解析为字符串。

在给定类上使用静态方法时,会使用括号。在实例化特定类的新对象时,不需要括号

括号还用于将变量强制转换为特定类型

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

在给定类上使用静态方法时,将使用括号。在实例化特定类的新对象时,不需要括号

括号还用于将变量强制转换为特定类型

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

如果在第一个例子中什么有效?我不清楚第一个例子中哪一点比第二个例子好。在这两种情况下,您都得到了[TypeName]::MethodName。如果在第一个示例中什么有效?我不清楚第一个例子中哪一点比第二个例子好。在这两种情况下,您都得到了[TypeName]::MethodName。下次,请编辑您的原始问题。不要认为stackoverflow是一个论坛。你的“澄清”将在这个答案列表的底部,没有人会看到它。这会让那些迟到的人感到困惑。下次,编辑你原来的问题。不要认为stackoverflow是一个论坛。你的“澄清”将在这个答案列表的底部,没有人会看到它。这会让那些来的人感到困惑。我认为问题作者有一个静态方法的概念,因为他明确提到了它们+我认为问题作者有静态方法的概念,因为他明确提到了静态方法+1.