PowerShell:什么是 System.IO.StreamWriter 和 System.Diagnostics.ProcessStartInfo?

PowerShell: what is System.IO.StreamWriter and System.Diagnostics.ProcessStartInfo?

我正在学习 PowerShell。有了System.IO.StreamWriter and System.Diagnostics.ProcessStartInfo,叫他们“类”是不是更准确?或者它们也可以被称为“新对象”吗?

$foo = New-Object System.Diagnostics.ProcessStartInfo

System.IO.StreamWriterSystem.Diagnostics.ProcessStartInfoclasses,更广泛地说 类型 (或.NET 中的数据类型)

PowerShell 在 .NET 上运行,在 .NET 的类型系统中,“class”是我们称之为 行为的 蓝图 reference-type 个对象.

$foo = New-Object System.Diagnostics.ProcessStartInfo

在上面的语句中,我们要求New-Object创建一个实例 ProcessStartInfo - 即,我们想要一个 行为 的对象,如 ProcessStartInfo class 所规定的那样。我们也可以说结果对象(现在由 $foo 引用)是 类型 ProcessStartInfo.

引用类型与值类型

上面我提到了引用类型对象。这一点很重要的原因是 .NET 类型可以分为 类型 - 引用类型 值类型 .

值类型类似于 built-in 数值类型([int][double][decimal][bool] 等)——但也包括更复杂的数据[datetime] 等类型,Get-Date.

返回的对象类型

这种区别(参考与价值)之所以重要是因为它们在分配和存储时表现不同。对于值类型,任何赋值都会导致 .NET 将对象的值复制到赋值目标:

$a = 1    
$b = $a   # Assign value of $a to $b
$a++      # Modify value of $a
$b        # Is $b 1 or 2?

在赋值操作 $b = $a 期间,PowerShell 查看 $a,发现其值 1 的类型为 [int] 并存储 $b 中值 1 的新副本 - 所以即使我们将 $a 的值增加到 2,$b 的值也没有改变。

对于引用类型,情况并非如此。引用类型对象通过引用存储和传递:

$a = [System.Diagnostics.ProcessStartInfo]::new("calc.exe")
$b = $a
$a.FileName = "notreally.exe"
$b.FileName             # Is $b.FileName "calc.exe" or "notreally.exe"?

在这种情况下,因为 [System.Diagnostics.ProcessStartInfo] 是引用类型,所以 $a 不包含 (即与对象关联的数据),它只包含一个 reference 或一个 pointer 指向数据真正存储在内存中的位置,而分配 $b = $a 不会复制对象,而不是 $a$b 最终引用相同的底层对象,并且在通过另一个查询时反映对一个对象的修改。