我已经开始使用PowerShell来完成一些事情,并在PowerShell中使用变量$null
。
我遇到的问题是,当我将变量$null
分配给类中定义的变量时,测试返回false
而不是true
。
示例代码:
class test {
[string]$test1
}
$test = [test]::new()
$test.test1 = $null
$null -eq $test2 # tests true
$null -eq $test.test1 # tests false
现在,对未定义变量< code>$test2的测试返回< code>true,因为PowerShell中的每个未定义变量都被赋予了< code>$null。
但是,如果我测试我分配给$null
的对象test
的属性test1
,则会测试$null
的false
是不是因为在PowerShell$null
中是一个值为$null
的对象,现在对象的属性不是$null
,因为它将对象$null
分配给它的值为空?
我在微软的文档中读到了“你想知道的关于$null的一切”,但这并没有启发我。
如果我没有初始化变量,那么它将为< code>$null测试< code>true。
详细说明罗比的有用答案:
> < li>
根据设计,PowerShell中的< code>[string]类型变量、参数变量和自定义类属性不存储< code>$null[1],只存储实际的字符串值。赋值< code>$null总是转换为< code>''(空字符串)。
>
在下面,$var
接收'
,而不是$null
,因为它是[string]
-类型的;因此,第一个-eq
测试失败,第二个测试成功。
< code >[string]$ var = $ null;$ null-eq $ var;'-eq $var
请注意,其他. NET引用类型(与值类型相反,值类型基本上不能为空)在PowerShell中不受影响;也就是说,您可以将$null
分配给它们。值得注意的是,这也适用于[对象]
。请注意,不对变量/参数/属性进行类型约束与[对象]
键入相同。
尽管如此,PowerShell类
中未初始化的[string]
属性目前默认为$null
应被视为错误-请参阅GitHub问题#7294。
> < li>
如果您显式初始化为< code>$null,这种不一致会变得很明显,这将再次转换为< code>''并使测试失败。
类test{[string]$test1=$null};$null-eq[test]::new(). test1
如果错误得到修复,并且您确实需要[string]
-类型属性中的$null
值-这在PowerShell代码的上下文中是不明智的-您必须使用[NullString]::value
,如下链接的答案所示:类测试{[string]$test1=[NullString]::value}$null-eq[test]::new().test1
有关更多信息,请参阅此答案。
[1]为了简化,PowerShell对无法存储$null
进行了限制。基础.NET类型,<代码>系统。字符串,在其他语言中通常没有此限制,尤其是在C#中。
如果您使用类型constraint
,例如[string]
或[int]
Powershell在null
-赋值处初始化成员,默认为有限制的类型。
正如@robdy在上述答案中指出的,您要么检查类型默认值,要么删除约束。
如果您使用的是[int]
类型contstraint,这可能会变得更加明显:
class test {
[int]$i1 = 42
}
$test = [test]::new()
Write-Host $test.i1
$test.i1 = $null
Write-Host $test.i1
输出:
42
0
< code>$test.test1不是< code>$null,它是空字符串(因为您显式地将其值定义为< code>[string]):
C:\> $test.test1.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
证明:
C:\> $test.test1 -eq ""
True
问题内容: 这有效: 但这不是: 为什么?我有一种感觉,这与对象是内置类有关,但是我发现这并不令人满意,因为我在MyClass的声明中没有进行任何更改。 问题答案: Python将属性存储在字典中。您可以将属性添加到,看到它具有 : 重要的区别是没有属性。
问题内容: 我正在尝试从字符串(从Web获取)中读取JSON,但返回。 具体来说,给我 考虑包含以下JSON字符串: 编辑:最终代码工作 特别感谢Sufian和Ved! 问题答案: “ id”和“ name”位于JSON对象内部,键为“ rikeard”。因此,您需要进行如下更改:
我将hibernate 5.3.11与SpringDataJpa和PostgreSQL一起使用,在试图更新复杂实体ClassC时,我得到了“org.hibernate.id.IdentifierGenerationException:试图从null一对一属性[packagename.classb.classa]分配id”。 classC是@onetomany with classa classa是
我已经创建了一个类get set,但是调试显示v有一个对象类型,如何将对象分配到属性中?有什么想法吗?
我想给一个对象里所有值为null的属性赋其它值,比如: 有没有大佬知道 assignDefaults 这个函数如何实现?
问题内容: 首先看下面的JavaScript对象 我想将值设置为与相同,因此我将对象值放在前面,但它对我不起作用,我也使用过,但仍然失败。我的问题是如何访问对象内对象的属性。 一些用户沉迷于问“您想做什么或发送脚本等”,对于那些人来说,答案很简单:“我想访问对象内的对象属性”,上面提到了脚本。 任何帮助将不胜感激 :) 问题答案: 使用 对象文字 语法时,不能在初始化期间引用对象。创建对象后,需要