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.StreamWriter
和 System.Diagnostics.ProcessStartInfo
是 classes,更广泛地说 类型 (或.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
最终引用相同的底层对象,并且在通过另一个查询时反映对一个对象的修改。
我正在学习 PowerShell。有了System.IO.StreamWriter and System.Diagnostics.ProcessStartInfo,叫他们“类”是不是更准确?或者它们也可以被称为“新对象”吗?
$foo = New-Object System.Diagnostics.ProcessStartInfo
System.IO.StreamWriter
和 System.Diagnostics.ProcessStartInfo
是 classes,更广泛地说 类型 (或.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
最终引用相同的底层对象,并且在通过另一个查询时反映对一个对象的修改。