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

问题描述

我正在学习PowerShell。使用System.IO.StreamWriterSystem.Diagnostics.ProcessStartInfo,将它们称为“类”是否更准确?还是也可以将它们称为“新对象”?

$foo = New-Object System.Diagnostics.processstartinfo

解决方法

System.IO.StreamWriterSystem.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最终引用了相同的基础对象,并且在通过另一个询问时会反映出对一个的修改。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...