我有下面这段代码
List<String> l = new List<String>();
String s = "hello";
l.Add(s);
s = "world";当我设置一些断点并遍历程序时,在执行最后一行之后,列表中的值仍然是hello而不是world。
它不应该等于world吗?字符串不是对象吗?我不只是在列表中插入一个指针吗?稍后,如果我将字符串更改为指向不同的值("world"),为什么我的列表仍然引用旧的值?
怎样才能得到我想要的效果?非常感谢!
发布于 2011-08-02 22:13:09
字符串是不可变的,所以这不会起作用。当您尝试设置它时,实际上是将指针放到旧字符串中,并在幕后创建一个新字符串。
要获得所需的效果,请创建一个包装字符串的类:
public class SortOfMutableString
{
public string Value {get;set;}
public SortOfMutableString(string s)
{
Value = s;
}
public static implicit operator string(SortOfMutableString s)
{
return s.Value;
}
public static implicit operator SortOfMutableString(string s)
{
return new SortOfMutableString(s);
}
}并在你的列表中使用这个。然后引用将指向类,但您可以在其中包含字符串值。为了让它更好,覆盖implicit对字符串和对字符串的转换,这样你甚至不需要看到你正在和一个SortOfMutableString对话。
参考Jon Skeet的回答,毫无疑问,关于C#中的字符串有一个非常准确的解释,我甚至不会费心去做!
备用类名:
发布于 2011-08-02 22:11:59
您正在更改s引用以引用不同的String实例。
字符串是不可变的;不可能更改添加到列表中的现有实例。
相反,您可以创建一个具有可写String属性的可变StringHolder类。
发布于 2011-08-02 22:12:28
不,它不应该等于world。变量s的值是一个引用。调用l.Add(s)时,该引用将按值传递给列表。因此,该列表现在包含对字符串"hello“的引用。
现在将s的值更改为对字符串"world“的引用。这根本不会改变列表。
区分三个非常不同的概念很重要:
null)
的值
因此,该列表不知道任何有关变量s的信息-它知道传递给Add的值;该值恰好是调用Add时s的值,仅此而已。
你可能会发现这些文章很有帮助:
https://stackoverflow.com/questions/6913435
复制相似问题