什么是添加类型与方括号?

What is Add-Type vs square bracket?

要使用 .net 类型,我通常先 Add-Type 然后使用 New-Object:

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

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

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

它们有什么区别?我没有找到太多包含 .Net 类型方括号语法的文档。我找到的所有关于方括号的文档都是关于数组的。

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

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

  • 任何 PowerShell 版本中:

  • 最好在 PowerShell 中 v5+:

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

Lee_Dailey and Theo 所述,使用静态 ::new() 方法有几个优点:

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

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

  • 调用 ::new() 不会像 New-Object 和 cmdlet 通常那样将新创建的实例包装在 - 大部分 - 不可见的 [psobject] 包装器中;虽然这个包装器大部分是良性的,但它可能会导致行为上的细微差异 - 请参阅 GitHub issue #5579.

请注意,由于 PowerShell 的两个基础 parsing modes, New-Object and ::new() require different syntax, as discussed in