字符串不变性是通过语句还是通过语句中的字符串来工作的?
例如,我了解以下代码将在堆上分配两个字符串.
string s = "hello ";
s += "world!";
Run Code Online (Sandbox Code Playgroud)
"你好"将留在堆上,直到垃圾收集; 现在引用"你好世界!" 在堆上.但是,以下行在堆上分配了多少个字符串... 1或2?此外,是否有工具/方法来验证结果?
string s = "goodbye " + "cruel world!";
Run Code Online (Sandbox Code Playgroud) 不可变的字体会使程序员和GC都感到困扰,因为每次都需要创建一个新实例.
为什么Font是一个不可变的引用类型呢?
我正在寻找一个内置属性来指定一个类型是不可变的,我只找到了 System.ComponentModel.ImmutableObjectAttribute.
使用Reflector,我检查了它的使用位置,似乎唯一使用它的公共类是System.Drawing.Image ... WTF?它可以用在string,int或任何基本类型上,但Image绝对不是不可变的,有很多方法可以改变它的内部状态(例如使用Graphics或Bitmap.SetPixel方法).
所以BCL中唯一明确声明为不可变的类是可变的!或者我错过了什么?
我想使对象的结构不可变,防止其属性随后被替换.但是,属性需要是可读的.这可能吗?
我确信没有语言功能(final在Java和readonlyC#中都有)来支持这一点,但是想知道是否可能有另一种机制来实现相同的结果?
我正在寻找这些方面的东西:
var o = {
a: "a",
f: function () {
return "b";
}
};
var p = o.a; // OK
o.a = "b"; // Error
var q = o.f(); // OK
o.f = function () { // Error
return "c";
};
Run Code Online (Sandbox Code Playgroud) 我搜索并找到了有关此主题的一些信息,但答案要么令人困惑,要么不适用.
我有这样的事情:
class Thing (val name:String, val refs:IndexedSeq[Ref])
class Ref (val name:String, val thing:Thing)
Run Code Online (Sandbox Code Playgroud)
现在,我想说,加载一个文件,解析它并从中填充这个数据结构.它是不可变的和循环的,怎么会这样做?
另外,假设我确实填充了这个数据结构,现在我想修改它,比如更改rootThing.refs(3).name,怎么可能这样做呢?
感谢此处发布的想法.在这一点上,我在想如果一个人真的想要这样的东西的持久性数据结构,那就跳出框框思考并考虑客户端代码需要问什么问题.因此,不要考虑对象和字段,而应考虑查询,索引等.首先,我在想: 是否存在双向多图持久数据结构?
我正在对一些代码进行审查,并且遇到了一个有人在增加一个成员变量的实例,该成员变量是一个围绕Integer的包装类.我亲自尝试过,真的很惊讶它有效.
Integer x = 0;
System.out.print(x++ + ", ");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)
这打印出来0, 1,不像0, 0 我预期的那样.我查看了语言规范,找不到任何涉及此内容的内容.任何人都可以向我解释为什么它可以工作,如果它在多个平台上是安全的?我原本以为这会分解成
Integer x = 0;
int temp1 = x.intValue();
int temp2 = temp1 + 1;
System.out.println(temp1);
temp1 = temp2;
System.out.println(x.intValue());
Run Code Online (Sandbox Code Playgroud)
但显然规范中有些东西会在x = temp1;最后一行之前添加
创建无法在PHP中更改的对象是一个好主意吗?
例如,具有setter方法的日期对象,但它们将始终返回对象的新实例(具有修改日期).
这些对象是否会让使用该类的其他人感到困惑,因为在PHP中,您通常希望对象发生变化?
例
$obj = new Object(2);
$x = $obj->add(5); // 7
$y = $obj->add(2); // 4
Run Code Online (Sandbox Code Playgroud) 我试图准确理解Java字符串是如何不可变的.我知道这可能是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白.
我不明白Java Strings是如何"不可变的".我目前有以下代码:
public static void main(String[] args) {
String name = "Jacob Perkins";
System.out.println( name );
name = name + "!";
System.out.println( name );
}
Run Code Online (Sandbox Code Playgroud)
我的输出如下:
Jacob Perkins
Jacob Perkins!
Run Code Online (Sandbox Code Playgroud)
如果字符串应该是不可变的,为什么会发生这种情况呢?为什么我能够为字符串重新赋值?
在Java中声明最终集合意味着什么?难道不再添加任何元素吗?是否已经存在的元素无法改变?还有别的吗?
我在我的flux应用程序中使用了immutable.js.它非常有用,可以提升性能.但实际上让我感到难过的是我不能将lodash与它一起使用.Lodash提供了很棒的API,有很多有用的功能,所以我想也许有办法让它们在一起为我工作?
immutability ×10
java ×3
.net ×2
final ×2
javascript ×2
string ×2
c# ×1
class ×1
collections ×1
cyclic-graph ×1
fonts ×1
immutable.js ×1
lodash ×1
php ×1
reactjs ×1
scala ×1