首页 > 解决方案 > 什么是 Add-Type vs 方括号?

问题描述

要使用 .net 类型,我通常会Add-Type使用New-Object

Add-Type -AssemblyName "System.Windows.Forms"
$win = New-Object Windows.Forms.Form

但实际上我也可以只使用方括号语法来引用类型并使用静态方法:

$win = [System.Windows.Forms.Form]::new()

他们之间有什么区别?对于 .Net 类型,我没有找到太多带有方括号语法的文档。我为方括号找到的所有文档都是针对数组的。

标签: powershellsyntaxconstructor

解决方案


Add-Type仅用于将.NET 类型加载到会话中(或通过临时编译来定义它们)。

要通过调用它们的构造函数来使用这些类型,您有两种选择:

  • 任何PowerShell 版本中:

  • 最好在 PowerShell v5+中:

    • 使用类型文字( [...]) 并调用类型的(PowerShell 提供的)静态::new()方法。
    • 有关 PowerShell 类型文字的更多信息,请参阅此答案

正如Lee_DaileyTheo所指出的,使用静态::new()方法有几个优点:

  • 通话::new()速度更快;一个或只有几个构造函数调用可能无关紧要,但它可能在循环中。

  • ::new 不带括号执行会显示所有构造函数重载,这是找出需要哪些构造函数参数以及它们的类型是什么的便捷方法。

  • 调用::new()不会将新创建的实例包装在 - 主要是 - 不可见[psobject]的包装器中,就像New-Objectcmdlet 通常那样;虽然这个包装器大多是良性的,但它可能会导致行为上的细微差别 - 请参阅GitHub 问题 #5579

请注意,由于 PowerShell 的两种基本解析模式New-Object并且::new()需要不同的语法,如本答案中所述。


推荐阅读