首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取可变字符串的列表?

如何获取可变字符串的列表?
EN

Stack Overflow用户
提问于 2011-08-02 22:10:09
回答 6查看 995关注 0票数 2

我有下面这段代码

代码语言:javascript
复制
  List<String> l = new List<String>();
  String s = "hello";
  l.Add(s);
  s = "world";

当我设置一些断点并遍历程序时,在执行最后一行之后,列表中的值仍然是hello而不是world

它不应该等于world吗?字符串不是对象吗?我不只是在列表中插入一个指针吗?稍后,如果我将字符串更改为指向不同的值("world"),为什么我的列表仍然引用旧的值?

怎样才能得到我想要的效果?非常感谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-02 22:13:09

字符串是不可变的,所以这不会起作用。当您尝试设置它时,实际上是将指针放到旧字符串中,并在幕后创建一个新字符串。

要获得所需的效果,请创建一个包装字符串的类:

代码语言:javascript
复制
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#中的字符串有一个非常准确的解释,我甚至不会费心去做!

备用类名:

  • PseudoMutableString
  • ICantBelieveItsNotMutable
  • HappyAndReferenceableString
票数 5
EN

Stack Overflow用户

发布于 2011-08-02 22:11:59

您正在更改s引用以引用不同的String实例。

字符串是不可变的;不可能更改添加到列表中的现有实例。

相反,您可以创建一个具有可写String属性的可变StringHolder类。

票数 4
EN

Stack Overflow用户

发布于 2011-08-02 22:12:28

不,它不应该等于world。变量s的值是一个引用。调用l.Add(s)时,该引用将按值传递给列表。因此,该列表现在包含对字符串"hello“的引用。

现在将s的值更改为对字符串"world“的引用。这根本不会改变列表。

区分三个非常不同的概念很重要:

null)

  • An对象变量(具有名称和值)对象引用(用于导航到对象或

的值

因此,该列表不知道任何有关变量s的信息-它知道传递给Add的值;该值恰好是调用Adds的值,仅此而已。

你可能会发现这些文章很有帮助:

  • Values and references
  • Parameter passing in C#
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6913435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档