代码之家  ›  专栏  ›  技术社区  ›  viky

我可以使字符串的行为类似于引用类型吗?

  •  1
  • viky  · 技术社区  · 15 年前

    在C中,字符串是引用类型,但其行为类似于值类型。 例如

    string str = "I am a string";
    str.Replace("am", "was");  //str still contains same value, 
    //i want it to make "I was a string"
    

    我知道我可以通过

    str = str.Replace("am", "was");
    

    但我不想重新分配。 有没有办法让它们表现得像引用类型?

    附加:

    我有一个键值对 收藏(不是字典)和我想要的 给某些文本加前缀 键(字符串),现在我要删除 然后创建一个 使用相同值并添加 在收藏中。我不想要 这样做似乎不是 正确的方法。我想更新钥匙 直接。

    编辑:

    我可能从模型中得到两个集合,每个集合中具有相同的键,具有不同的值。因此,在视图模型中,我想通过分别为第一个和第二个集合的值预先固定键来更改键。并且会使所有键都独一无二。

    7 回复  |  直到 15 年前
        1
  •  2
  •   James    15 年前

    您可以创建一个帮助器方法来更新字符串,例如

    public static class StringHelper
    {
        public static void Replace(ref string originalStr, string strToReplace, string replaceStr)
        {
             originalStr = originalStr.Replace(strToReplace, replaceStr);
        }
    }
    

    用法

    var str = "I am a string";
    StringHelper.Replace(ref str, "am", "was");
    
        2
  •  10
  •   Marat Faskhiev    15 年前

    使用System.Text.StringBuilder。

    如果不能使用StringBuilder,请尝试在此处阅读 http://www.codeproject.com/KB/dotnet/strings.aspx

    参见“直接修改字符串”。

        3
  •  3
  •   bakasan    15 年前

    你的选择基本上是:

    • 别管闲事(强烈推荐)
    • 创建自己的字符串类(为什么?如果下游的其他开发人员不知道您的意图,那么欢闹就会随之而来)
    • 使用StringBuilder以内存方式将字符串连接在一起(可能解决大多数问题)
        4
  •  3
  •   Daniel May    15 年前

    不, strings 是不可变的。如果需要不断附加到字符串,请使用 System.Text.StringBuilder (MSDN) 并使用append方法。

    var sb = new StringBuilder();
    sb.Append("I");
    sb.Append(" am");
    sb.Append(" still");
    sb.Append(" a string");
    Console.WriteLine(sb.ToString());
    
        5
  •  3
  •   maciejkow    15 年前

    不,字符串是不可变的(一旦创建,就不能更改它们)。但是,如果你 真正地 (我无法想象这种情况对我来说是可以接受的)需要这个,您可以创建自己的类(让我们将其命名为mutableString),它将向字符串公开类似的公共API,但会在内部处理这些重新分配,并隐式地从/到字符串强制转换。

    编辑: 记住重写getHashCode()和equals(),否则集合将不起作用。但是-建议哈希代码保持不变-所以基本上,您所能做的就是为每个可变字符串返回0。如果您将它用作依赖哈希代码(如字典)的集合中的键,这将是一个性能问题—请注意这一点。

        6
  •  2
  •   Jeremy McGee    15 年前

    不是直接的。您需要创建自己的类,该类依次包含一个字符串,并具有自己的方法来处理replace和suchlike。

    不可避免的问题是——为什么?你在什么情况下担心 string 不象它那样表现吗?

        7
  •  2
  •   Henk Holterman    15 年前

    不,你不需要。

    最好退后一步,向我们展示您试图用可变字符串解决的问题。

    从评论中编辑:

    我有一个键值对 收藏(不是字典)和我想要的 给某些文本加前缀 键(字符串),现在我要删除 然后创建一个 使用相同值并添加 在收藏中。我不想要 这样做似乎不是 正确的方法。我想更新钥匙 直接。

    你看到了一个没有问题的地方。只使用 s = s.Replace() 模式。这是正确的(也是唯一的)方法。

    使用StringBuilder是可能的,但不会有太多帮助,它只处理实际替换的性能。

    如果您想加快速度,就必须显示集合类的API。可以只替换键/值对中的键。