如何通过引用将字符串传递到集合中

本文关键字:集合 字符串 何通过 引用 | 更新日期: 2023-09-27 18:25:01

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

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"

有没有一种更简单的方法可以通过引用将字符串传递到集合中,而不将其包装到类中我想将对象成员传递到集合中,如果对象发生了更改,那么也应该在不编写额外代码的情况下更改集合。

如何通过引用将字符串传递到集合中

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

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

然而,.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"

这里有一个让代码更简单的想法:

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对象。由于我们有这些隐式运算符,您可以使用MySString而不是字符串

不能通过引用传递内部数据类型,它们总是通过值传递的。内部类型包括Int32、String、Bool等基本类型。