【问题标题】:Can a string with a noteproperty be modified可以修改带有note属性的字符串吗
【发布时间】:2020-04-06 07:58:27
【问题描述】:

有什么方法可以在不丢失任何音符属性的情况下修改字符串?

$t = 'something'|Add-Member noteproperty one 1 -PassThru
$t.one
1
$t = 'else'
$t.one
<nothing here>
$t.value = 'else'  # The property 'value' cannot be found on this object

【问题讨论】:

    标签: powershell


    【解决方案1】:

    简而言之:不,如果没有丢失任何实例级 NoteProperty 成员附加到先前的值,您就不能修改 [string] 变量的值。


    NoteProperty 实例与您通过管道传送到 Add-Member 的特定对象(字符串)实例相关联。[1]

    通过为变量$t ($t = 'else') 分配一个不同 字符串实例,原始实例将丢失,您添加的NoteProperty 也会随之丢失。

    还要注意[string] 实例,即使用 NoteProperty 成员装饰,也永远不会有 .value 属性。但是,诸如 ConvertTo-Json 之类的 cmdlet 可能会显示存在 .value 属性,因为这就是它们使用 NoteProperty 成员序列化字符串或 .NET 原始类型的方式。


    通常,最好避免将 NoteProperty 成员添加到 字符串 和 .NET value types 实例,原因有两个:

    • 你不能修改这些实例它们自己,你只能用修改后的副本替换它们(存储在同一个变量中),而这些副本总是不 拥有原始的 NoteProperty 成员。

    • 即使没有修改,将 NoteProperty 修饰的字符串或值类型作为 参数值在以下情况下会导致实例级 NoteProperty 成员丢失

      • 如果目标参数声明为特定的输入类型并且输入类型是字符串 ([string]) 或.NET 原始类型,包括以下值类型:[Bool], [Byte], [SByte], [Int16], [UInt16], [Int32], [UInt32], [Int64], [UInt64], [IntPtr], [UIntPtr], [Char], [Double], [Single]

      • 另外 - 这适用于 所有 值类型实例以及 [string] - 如果目标参数被声明为特定的 数组输入类型(例如,如果[datetime[]]-typed 参数接收到修饰的[datetime] 实例)

      • 但是,将这些实例传递给 untyped 或 - 实际上是相同的 - [object]- 或 [object[]]- 类型参数确实保留了装饰。 p>


    [1] 从技术上讲,仅对于 [string] 实例,它是与实例级 NoteProperty 相关联的不可见 [psobject] 包装器 - 如果使用 [string] 实例本身,可能会出现问题由于 .NET CLR 字符串实习而出现,其中具有相同内容的看似独立的字符串可以指向相同的实例作为优化 - 并且特定于实例的 NoteProperty 不应该意外地出现在用户期望的内容上一个不同的字符串。

    【讨论】:

    • 可以,使用[string].Replace时也会丢失。
    • 事实上,如果你将字符串传递给一个用 [string] 或 [string[]] 装饰参数的函数,它们就会丢失。几乎所有东西似乎都抛弃了它们。我只是希望有一些我没听说过的技巧。
    • 好点,@DávidLaczkó;更一般地说,鉴于字符串是不可变的,每当创建修改副本时,任何装饰都会丢失 - 请参阅我的更新。
    • 没错,因为将变量设置为修改后的副本是一个赋值。不错的作品!我的观点是,这个 NoteProperty 根本不是一个好主意,要考虑的事情太多了。我会改用自定义对象。
    猜你喜欢
    • 2016-05-08
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多