问题标签 [immutability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1680 浏览

reflection - F# 可变到不可变

全部,

我最近一直在涉足一些 F#,我想出了以下我从一些 C# 代码中移植的字符串生成器。它将对象转换为字符串,前提是它传递了属性中定义的正则表达式。对于手头的任务,它可能有点矫枉过正,但出于学习目的。

目前,BuildString 成员使用可变字符串变量 updatedTemplate。我一直在绞尽脑汁想办法在没有任何可变对象的情况下做到这一点,但无济于事。这让我想到了我的问题。

是否可以在没有任何可变对象的情况下实现 BuildString 成员函数?

干杯,

迈克尔

0 投票
6 回答
13162 浏览

objective-c - 关于 NSStrings 的最后一句话:可变和不可变

我读过几本书......和在线......关于不可变和可变字符串。他们声称“不可变字符串”无法更改。(但他们从不定义“改变”。)

哪些 NSString 可以在不使用 NSMutableString 的情况下进行更改?

该字符串包含“catfish”......我后来尝试将其更改为“cat”。(相同的字母,只是更短。)

它包含“猫”......我尝试将其更改为“鲶鱼”。(类似的开始......但只是变长了。)

我把“猫”改成“猫”。(相同的字母,但只是大小写发生了变化。)

我把“猫”变成了“狗”。(完全不同的字符串,但长度相同。)

我把“猫”改成了“山茱萸”。(完全不同的字符串,但更长。)

0 投票
2 回答
143 浏览

c# - 如何为不可变类型创建 const 成员?

如果您有这样的不可变类型:

和内部的成员,如起源:

你应该使用:

?

在我看来,既然类型不能改变,为什么会有许多本质上相同的起源?就像我们永远不会改变 0,对吧?

如何为不可变类型实现相同的目标?

0 投票
10 回答
1556 浏览

c# - 不变性的真正定义?

我想知道如何定义不变性?如果这些值没有公开,所以不能修改,那么就足够了吗?

可以在类型内部修改值,而不是由该类型的客户修改吗?

还是只能将它们设置在构造函数中?如果是这样,在双重初始化的情况下(this在结构上使用关键字等)对于不可变类型仍然可以吗?

如何保证类型是 100% 不可变的?

0 投票
4 回答
2563 浏览

c# - 只读是否有任何运行时开销?

出于某种原因,我一直假设readonly字段具有与之相关的开销,我认为这是 CLR 跟踪readonly字段是否已初始化。这里的开销将是一些额外的内存使用来跟踪状态并在分配值时进行检查。

也许我假设这是因为我不知道一个readonly字段只能在构造函数内或字段声明本身内初始化,并且没有运行时检查,您将无法保证它不会被多次分配方法。但是现在我知道了,C# 编译器可以很容易地对其进行静态检查,对吧?是这样吗?

另一个原因是我读到使用 对readonly性能有“轻微”影响,但他们从未提出过这种说法,我找不到关于这个主题的信息,因此我提出了问题。我不知道除了运行时检查之外还有什么其他的性能影响。

第三个原因是我看到它readonly在编译后的 IL 中保留为initonly,那么如果readonlyC# 编译器保证该字段永远不会分配给构造函数还是声明?

另一方面,我发现您可以通过反射设置 a 的值,而 CLR 不会抛出异常,如果是运行时检查readonly int,这是不可能的。readonly

所以我的猜测是:“只读”只是一个编译时特性,任何人都可以确认/否认这一点吗?如果是,那么将这些信息包含在 IL 中的原因是什么?

0 投票
10 回答
17551 浏览

c# - 不可变集合?

我在我的应用程序中使我的大部分基本类型都是不可变的。但是集合也应该是不可变的吗?对我来说,这似乎是一个巨大的开销,除非我错过了什么。

我说的是保存 Point3 值等的集合,这些集合可以在不同时间添加。因此,如果一个集合中有 1M 个值,而您需要删除其中的 1 个,则必须重新创建相同的集合,对吗?

0 投票
7 回答
1185 浏览

c# - 不可变类型的哈希码

关于哈希码的不可变类型是否有任何考虑?

我应该在构造函数中生成一次吗?

您如何明确哈希码是固定的?我是不是该?如果是这样,使用名为 HashCode 的属性而不是 GetHashCode 方法会更好吗?会有什么缺点吗?(考虑到两者都可以,但建议使用该属性)。

0 投票
6 回答
633 浏览

c# - 复制不可变类型有意义吗?

在不可变类型上实现复制方法并返回新实例是否有意义?还是应该只是当前实例?

我认为类型无论如何都不会改变,所以为什么要复制?就像没有人复制数字 5 一样,对吧?

0 投票
4 回答
8851 浏览

java - Java 中的不可变对象和访问数据

我已经用 Java 实现了一个类,它在内部存储了一个List。我希望这个类是不可变的。但是,我需要对在类上下文中没有意义的内部数据执行操作。因此,我有另一个类定义了一组算法。这是一个简化的示例:

包装器.java

算法.java

现在,我的问题是,有没有一种可靠的方法可以防止有人修改我的内部数据,尽管我的类是不可变的?虽然我提供了一个用于只读目的的data()方法,但没有什么可以阻止某人通过clear()remove()等方法修改数据。现在,我意识到我可以通过迭代器专门提供对我的数据的访问。但是,有人告诉我传递Collection是典型的。其次,如果我有一个算法需要对数据进行多次传递,我将不得不提供多个迭代器,这似乎是一个滑坡。

好的,希望有一个简单的解决方案可以解决我的担忧。我刚刚回到 Java,在处理C++ 中的const之前从未考虑过这些事情。提前致谢!

哦!我刚刚想到的还有一件事。我实际上无法返回内部List的副本。该列表通常包含数十万个元素。

0 投票
9 回答
1945 浏览

collections - 删除foreach中的项目

是否应该允许您从当前在 foreach 循环中迭代的集合中删除一个项目?

如果是这样,正确的行为应该是什么?