存储对字符串的引用

时间:2009-07-27 16:43:39

标签: c# string

我有一个有3个字符串属性的类。我想将它们存储在一个列表中,这样当我对列表的字符串进行更改时,它们也会在类中更新。

如果我使用类对象,这很容易做,但字符串似乎表现不同。它似乎为列表创建了一个对象的副本,而不是指向该对象的指针。我怎么做这个是C#?如果这不可能有更好的方法吗?

9 个答案:

答案 0 :(得分:6)

string的问题在于它们是不可变的。换句话说,一旦创建string,就永远无法更改。{/ p>

因此,如果您要“更改”string,则必须从List中删除原始内容,然后将结果存储回列表中。例如:

string a = "abcdefg";
List<String> list = new List<String>();
list.add(a);

a = a.Substring(0, 5);

该代码无效,因为string a指向永不改变。它只是指向一个新的string

答案 1 :(得分:3)

在.NET中,字符串是不可变的。如果更改字符串,则实际上是在创建一个新字符串并修改引用。

我会考虑使用StringBuilder对象来解决您的问题。

答案 2 :(得分:3)

字符串是不可变的。您可以将引用更改为指向另一个字符串但不能修改字符串,以便对其进行其他引用也会更改值(除了不安全,完全危险的反射代码)

您要做的是通过使用可变替代方法(例如StringBuilder)或通过显式间接方式来处理此问题。我会告诉你后者:

public class Props
{
    private readonly string[] data = new string[2];

    public string Foo {
        get { return data[0]; }
    }

    public string Bar {
        get { return data[1]; }
    }

    public IList<string> ModifyValueButNoInsertsList { get { return data;} }
}

实际上你应该考虑在这种情况下实际使用string []而不是IList,因为它清楚地表明插入是禁止的,只是改变了值。由于string []实现IList<string>,因此这不太可能是一个问题

答案 3 :(得分:2)

由于字符串是不可变的,最简单的解决方法是将引用存储为带有一个元素的字符串数组。任何引用该数组的人都会注意到替换该元素。

答案 4 :(得分:2)

C#中的字符串是不可变的,因此您无法在C#中更改字符串 - 您只能创建新的字符串。

您可能更愿意存储具有字符串成员的类

class StringHolder {
  public StringHolder(string s) { str = s;} 
  public string str;
}
...
List<StringHolder> l1 = new List<StringHolder>();
List<StringHolder> l2 = new List<StringHolder>();
List<StringHolder> l3 = new List<StringHolder>();

StringHolder h = new StringHolder("Test\n");
l1.add(h);
l2.add(h);
l3.add(h);

h.str = h.str.Replace("\n","");

现在所有列表都引用相同的StringHolder,并且自然会看到相同的字符串。

另一种选择是在列表中存储StringBuilder对象而不是String。

答案 5 :(得分:2)

class StringHolder
{
    public string Value { get; set; }
}

保留这些列表而不仅仅是字符串。然后,您可以获取/设置Value属性以更新字符串值。

答案 6 :(得分:0)

你正在寻找某种可变的字符串。有很多方法可以创建一个行为符合您需要的类。

最简单的方法是使用StringBuilder对象而不是字符串。您只需要小心不要创建新的StringBuilder对象,而是改变现有的对象。根据您的需要,这可能不是最佳选择。

或者,您可以为String创建自己的包装类,您可以自由操作。缺点是您可能必须编写许多存根方法,这些方法根据您的使用方式调用内部字符串。公开读/写字符串属性会更容易。这样做的好处是可以让您准确定义所需的行为,但首先需要更长的时间来编写。同样,你必须确保不创建包装类的新实例,而只是改变类的内部字符串。

答案 7 :(得分:0)

将您的字符串包装到自定义类中,这将允许您在多个不同位置之间共享它。您也可以选择存储Char数组。

答案 8 :(得分:0)

作为旁注(如同几个提到的那样),如果您正在使用字符串进行一些繁重的处理,请使用StringBuilder类。由于字符串的不可变性,在循环中改变/连接它们或者你有什么 - 会导致很多开销。

StringBuilder是你的朋友。