如何通过引用将字符串传递给集合?

时间:2012-02-19 12:45:39

标签: c# collections pass-by-reference

字符串似乎是引用,但是按值复制

List<string> data = new List<string>();
string s = "a";
data.Add(s); // copy by value??
s = "b";
Console.WriteLine(data[0]); // "a"

似乎该类是通过引用复制的引用

class boxstring { public string val; }
List<boxstring> data = new List<boxstring>();
boxstring s = new boxstring { val = "a" };
data.Add(s); // copy by reference, ok
s.val = "b";
Console.WriteLine(data[0].val); // "b"

是否有更简单的方法将字符串通过引用传递给集合而不将其包装到类中?我想将对象成员传递给集合,如果对象被更改,集合也应该是没有编写额外的代码就改变了。

4 个答案:

答案 0 :(得分:2)

字符串是不可变的,如果您希望容器中的对象发生更改,它们必须是可变的。因此,您必须将它们包装在类中。

答案 1 :(得分:1)

这是一个让你的代码更简单的想法:

public MyString
{
public string Value{get;set;}
public MyString(string value)
{
Value=value;
}



public static implicit operator MyString(string value)
{
return new MyString(value);
}

public static implicit operator string(MyString mystring)
{
if(mystring==null) return null;
return mystring.Value;
}

然后你可以使用MyString对象,只要你想通过reference引用字符串。因为我们有这些隐式运算符,你可以使用MyString代替字符串

答案 2 :(得分:1)

字符串是不可变的。每当您为字符串变量分配新值时,每次都会创建一个新实例,这就是您无法在集合中看到更新的原因。

然而,.NET已经提供了字符串的可变对应物,即“StringBuilder”。这对你有用 -

List<StringBuilder> data = new List<StringBuilder>();
StringBuilder s = new StringBuilder("a");
data.Add(s);
s.Clear();
s.Insert(0, "b");
Console.WriteLine(data[0]); // "b"

答案 3 :(得分:-2)

您不能通过引用传递内部数据类型,它们始终按值传递。 内在类型包括基本类型,如Int32,String,Bool等。