我正在学习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]
等) -但也更复杂的数据类型,如[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]
并存储值1 in的新副本$b
-因此,即使我们将值$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
不包含值(即与对象关联的数据),因此仅包含引用或指针,指向数据实际存储在内存中的位置,而分配$b = $a
不复制对象,而不是两个$a
及$b
两端向上引用相同的底层对象,并通过其他询问时一个的修改被反射。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句