当前位置: 首页 > 知识库问答 >
问题:

$null分配的对象-属性不会针对$null

姬承教
2023-03-14

我已经开始使用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,则会测试$nullfalse

是不是因为在PowerShell$null中是一个值为$null的对象,现在对象的属性不是$null,因为它将对象$null分配给它的值为空?

我在微软的文档中读到了“你想知道的关于$null的一切”,但这并没有启发我。

如果我没有初始化变量,那么它将为< code>$null测试< code>true。

共有3个答案

冯阳成
2023-03-14

详细说明罗比的有用答案:

> < 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#中。

  • 郑星辰
    2023-03-14

    如果您使用类型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
    
    令狐珂
    2023-03-14

    < 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对象 我想将值设置为与相同,因此我将对象值放在前面,但它对我不起作用,我也使用过,但仍然失败。我的问题是如何访问对象内对象的属性。 一些用户沉迷于问“您想做什么或发送脚本等”,对于那些人来说,答案很简单:“我想访问对象内的对象属性”,上面提到了脚本。 任何帮助将不胜感激 :) 问题答案: 使用 对象文字 语法时,不能在初始化期间引用对象。创建对象后,需要