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

应该为空或null的浮点变量被设置为0

温开畅
2023-03-14

我正在处理一个函数,它接受[Simple]$DurationMS作为可选参数。这应该是浮点值。所以在我的函数中,我有以下代码来检查它是否已提供给函数。如果提供了,我想将值添加到嵌套在另一个对象中的对象。

if ($DurationMS -ne $null) {
$MyObject.attributes | Add-Member -MemberType NoteProperty -Name 'duration.ms' -Value $DurationMS
}

一切看起来都很好,但当我测试它时,我在持续时间内得到0,我不知道为什么。

duration.ms
-----------
          0

所以我的情况评估为真,但我不明白为什么。

共有1个答案

申屠锦
2023-03-14

> < li>

[single]是. NET值类型,这种类型的实例永远不能是< code>$null。

  • [单]。返回$true值类型会告诉您它是一种值类型。
  • $null仅适用于 .NET 引用类型,并告诉您这是对无对象的引用。

因此,测试您的[单]-tybed$DurationMS参数变量是否为$null是毫无意义的:

    < Li > < code >[single]实例的默认值为< code>0,因此您的< code>$DurationMS -ne $null条件实际上默认为< code>0 -ne $null,即< code>$true。

检查参数是否在给定调用中传递给给定(非强制)参数的可靠方法是查阅自动$PSBoundParameters变量,如圣地亚哥·斯夸尔松所建议的那样。

  • 此变量包含一个字典,其中包含所有显式传递的参数的条目,这些参数按其参数名称(无前缀 -) 键控,例如,如果您的函数是使用 -DurationMS 1.2 调用的,$PSBoundParameters['DurationMS'] 返回 1.2并且 $PSBoundParameters.ContainsKey(“持续时间MS”)指示$true

因此:

# Was an argument passed to -DurationMS?
if ($PSBoundParameters.ContainsKey('DurationMS')) {
  $MyObject.attributes | 
    Add-Member -MemberType NoteProperty -Name 'duration.ms' -Value $DurationMS
}

以下方面是附带的:

>

  • if ($DurationMs) 仅在您还想考虑 0 的显式参数以表示“未提供任何值”时才有效,因为对于 [single] 类型$DurationMs如果 ($DurationMs)if ($DurationMs -ne 0) 相同

      < li>PowerShell允许您在布尔上下文中使用任何类型的表达式;对于数字类型,< code>0映射到< code>$false,任何非零值映射到< code>$true。 < li >虽然这种隐式到布尔的转换行为通常很方便,但它也有其缺陷——有关规则的总结,请参见本答案的下半部分。

    考虑到许多PowerShell运算符可以隐式操作数组(集合)作为LHS-在这种情况下,它们充当过滤器,返回匹配项的子数组-通常最好在LHS上放置一个标量比较操作数(在的情况下,我们知道非文字操作数根据定义也是标量-一个<code>〔single〕

    >

  • 将标量放置在LHS上可避免误报/误报,例如以下示例:

    $arr = 0, $null
    # !! -> 'null', because (0, $null) -ne $null filters the
    # !!    array to @(0), and [bool] @() - perhaps surprisingly - is $false
    if ($arr -ne $null) { 'not null' } else { 'null' }
    
    # OK, with $null on the LHS
    # -> 'not null'
    if ($null -ne $arr) { 'not null' } else { 'null' } 
    

    但是,即使在 LHS $null也可能表现出意外的行为,即
    -lt-le-gt-ge 运算符,如本答案中所述;

     $null -lt 0 # !! -> $true - even though [int] $null yields 0
    

    如果PowerShell为$null提供了专门的测试,则可以避免这些陷阱;实现这样的测试 - 以$var的形式 - 是$null$var - isull - 是GitHub PR #10704的主题;不幸的是,该PR被其创建者放弃了,此后没有人拿起这项工作,这就是为什么在PowerShell 7.2.2中不存在这样的测试。

    正如Lee Dailey指出的,像< code>duration.ms这样的属性名可能会有问题,因为它包含< code >。,这通常表示嵌套的属性访问,给定一个(未加引号的)< code >。充当成员访问操作员。

  •  类似资料:
    • 我试图创建一个javascript变量从JSON文件的内容GunsList.json(两者都存储在我的机器上的同一个文件夹)。 我似乎遇到了OP在这篇文章中遇到的相同问题,当他纠正了有缺陷的JSON文件时,问题得到了解决。考虑到我也有同样的问题,我通过JSONLint运行了我的文件(我假设这是正确的验证),结果它完全恢复正常。 借用本文中的技巧,我尝试使用jQuery来完成它(注意:我在现有代码的

    • 问题内容: 帮助我与同事解决争执:在Java中将变量或集合设置为null是否有助于垃圾回收并减少内存使用?如果我有一个运行时间较长的程序,并且每个函数都可能被迭代调用(可能数千次):在将值返回给父函数之前将其中的所有变量设置为null是否有助于减少堆大小/内存使用量? 问题答案: 那是旧的表演传奇。在1.0天之内确实如此,但是对编译器和JVM进行了改进以消除这种需求(如果有的话)。如果您感兴趣,这

    • 我有两个组件。 彩虹。jsx 彩虹列表.jsx 雨弓.jsx 是具有数组和雨弓列表.jsx 的主要组件,我用它来用 map() 以 li 格式显示所有彩虹色。 我在控制台日志中得到错误消息ShowRainBow。状态:必须设置为对象或null 我的代码 彩虹. jsx RainBowList.jsx

    • 本文向大家介绍当一个元素被设置为浮动后,它的display值变为什么呢?相关面试题,主要包含被问及当一个元素被设置为浮动后,它的display值变为什么呢?时的应答技巧和注意事项,需要的朋友参考一下 一个元素被设为绝对定位或者浮动后,其display计算值就变为了block,尽管其表现形式和inline-block类似——包裹内部元素且不超出包含块的特性。按照如下方式在控制台尝试可验证: var

    • 问题内容: 我从数据库中得到一个数字,这个数字可能是或。 我需要将数字的小数精度设置为,这会使数字不超过(关于小数)或。 使用PHP 我看到一个问题: 四舍五入数字。我需要一个仅将小数点缩短而不改变其值的函数,而这些值似乎不遵循。 问题答案: 您可以用来实现以下目的: 这将转换为。 但是,如果您只想将小数位数缩短到3,而 不是 四舍五入,则可以执行以下操作: 乍一看可能令人生畏,但是这个概念确实很

    • 我得到了这个转义的JSON 我需要使用Jackson将其转换为Java对象。 然后我创建了一个方法来转换它 Data类中设置为public的变量,那么调用getter时,我将获得。Data类中设置为private的变量,那么调用getter时将得到。 getter和setter总是公共的。