tex*_*uce 4 syntax powershell constructor
要使用 .net 类型,我通常会Add-Type使用New-Object:
Add-Type -AssemblyName "System.Windows.Forms"
$win = New-Object Windows.Forms.Form
Run Code Online (Sandbox Code Playgroud)
但实际上我也可以使用方括号语法来引用类型并使用静态方法:
$win = [System.Windows.Forms.Form]::new()
Run Code Online (Sandbox Code Playgroud)
他们之间有什么区别?我没有找到太多有关 .Net 类型的方括号语法的文档。我找到的所有关于方括号的文档都是针对数组的。
Add-Type仅用于将.NET 类型加载到会话中(或通过临时编译来定义它们)。
要通过调用它们的构造函数来使用这些类型,您有两种选择:
在任何PowerShell 版本中:
New-Object 最好在 PowerShell v5+中:
[...]) 并调用该类型的(PowerShell 提供的)静态::new()方法。正如Lee_Dailey和Theo所指出的,使用静态::new()方法有几个优点:
通话::new()速度更快;使用单个或仅几个构造函数调用可能并不重要,但它可能会循环。
::new 不带括号执行会显示所有构造函数重载,这是找出需要哪些构造函数参数及其类型的便捷方法。
调用::new()不会将新创建的实例包装在一个(大部分情况下)不可见的[psobject]包装器中,New-Object而 cmdlet 通常会这样做;虽然此包装器大部分是良性的,但它可能会导致行为上的细微差异 - 请参阅GitHub 问题 #5579。
请注意,由于 PowerShell 的两种基本解析模式,New-Object并且::new()需要不同的语法,如本答案中所讨论的。