powershell - 什么是 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 类型,我没有找到太多带有方括号语法的文档。我为方括号找到的所有文档都是针对数组的。
解决方案
Add-Type
仅用于将.NET 类型加载到会话中(或通过临时编译来定义它们)。
要通过调用它们的构造函数来使用这些类型,您有两种选择:
在任何PowerShell 版本中:
- 调用cmdlet。
New-Object
- 调用cmdlet。
最好在 PowerShell v5+中:
- 使用类型文字(
[...]
) 并调用类型的(PowerShell 提供的)静态::new()
方法。 - 有关 PowerShell 类型文字的更多信息,请参阅此答案。
- 使用类型文字(
正如Lee_Dailey和Theo所指出的,使用静态::new()
方法有几个优点:
通话
::new()
速度更快;一个或只有几个构造函数调用可能无关紧要,但它可能在循环中。::new
不带括号执行会显示所有构造函数重载,这是找出需要哪些构造函数参数以及它们的类型是什么的便捷方法。调用
::new()
不会将新创建的实例包装在 - 主要是 - 不可见[psobject]
的包装器中,就像New-Object
cmdlet 通常那样;虽然这个包装器大多是良性的,但它可能会导致行为上的细微差别 - 请参阅GitHub 问题 #5579。
请注意,由于 PowerShell 的两种基本解析模式,New-Object
并且::new()
需要不同的语法,如本答案中所述。
推荐阅读
- llvm-ir - 如何判断 LLVM IR 中的指令是否为调用指令?
- python-3.x - Pyinstaller PermissionError: [Errno 1] Operation not allowed: '/Users/user_name/dist/
- javascript - 我如何将一个 div 移动到另一个 div 下方并且仍然让顶部 div 具有“位置:固定”?
- python - 程序将向用户询问套件并打印该套件
- python-3.x - 为什么我们需要 `Asyncio.sleep` 来启动循环?
- android - 传递 ResultInfo Intent 尝试在空对象引用上调用虚拟方法的 Android 失败
- flutter - 删除导航器推送上的覆盖
- javascript - 在页面加载时自动运行 chrome 的控制台命令
- java - 按条件删除数组列表中的元素
- sql - 行之间的日期比较