【问题标题】:What is Add-Type vs square bracket?什么是 Add-Type vs 方括号?
【发布时间】:2021-08-01 18:25:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以使用第二个选项,但我认为它需要 PS 5.1+
  • 第二种方法在阅读代码时更快更明显。 New-ObjectAdd-Member 都非常慢。
  • 使用new()静态方法更快,但不仅如此,当你输入这样的方法创建一个不带括号的对象时,你可以看到所有重载的构造函数定义(如果有的话.. ) 帮助您选择。例如尝试[datetime]::new 并按回车键。附言我不会再使用[System.Reflection.Assembly]::LoadWithPartialName(),因为它是obsolete

标签: powershell syntax constructor


【解决方案1】:

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

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

  • 任何 PowerShell 版本中:

  • 最好在 PowerShell v5+ 中:

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

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

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

  • 只执行::new 不带括号显示所有构造函数重载,这是找出需要什么构造函数参数和它们的类型是什么。

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

请注意,由于 PowerShell 的两个基本 parsing modesNew-Object::new() 需要不同的语法,如 this answer 中所述。

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多