问题描述
我正在学习PowerShell。使用System.IO.StreamWriter和System.Diagnostics.ProcessStartInfo,将它们称为“类”是否更准确?还是也可以将它们称为“新对象”?
$foo = New-Object System.Diagnostics.processstartinfo
解决方法
System.IO.StreamWriter
和System.Diagnostics.ProcessStartInfo
是类,在.NET中更广泛地是类型(或数据类型)
PowerShell在.NET上运行,在.NET的类型系统中,“类”是蓝图,用于表现我们所谓的引用类型对象的行为。 >
$foo = New-Object System.Diagnostics.ProcessStartInfo
在上面的语句中,我们要求New-Object
创建一个ProcessStartInfo
的实例 -也就是说,我们想要一个 ProcessStartInfo
类规定的行为> 。我们也可以说结果对象(现在由$foo
引用)的类型为ProcessStartInfo 。
引用类型与值类型
上面我提到了引用类型对象。之所以重要,是因为.NET类型可以分组为种类-引用类型和值类型。
值类型既是内置数字类型([int]
,[double]
,[decimal]
,[bool]
等),也是更复杂的数据类型,例如{{ 1}},即[datetime]
返回的对象的类型。
这种区别(引用与值)很重要的原因是,它们在分配和存储时的行为有所不同。对于值类型,任何赋值都会使.NET将对象的值复制到赋值目标:
Get-Date
在分配操作$a = 1
$b = $a # Assign value of $a to $b
$a++ # Modify value of $a
$b # Is $b 1 or 2?
期间,PowerShell查看$b = $a
,发现其值$a
的类型为1
,并存储的新副本[int]
中的值1 -因此,即使我们将$b
的值增加到2,$a
的值也保持不变。
对于引用类型,情况并非如此。引用类型对象被存储并通过引用在中传递:
$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]
不包含 value (即与对象关联的数据),因此仅包含引用或指针指向数据实际存储在内存中的位置,分配$a
不会复制对象,而是同时复制$b = $a
和$a
最终引用了相同的基础对象,并且在通过另一个询问时会反映出对一个的修改。