Как передать строку в коллекцию по ссылке? - PullRequest
0 голосов
/ 19 февраля 2012

Кажется, что строка является ссылкой, но копируется по значению

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 ]

2 голосов
/ 19 февраля 2012

Строки являются неизменяемыми, если вы хотите, чтобы объекты в вашем контейнере изменялись, они должны быть изменяемыми.Поэтому вы должны обернуть их в класс так же, как и вы.

1 голос
/ 19 февраля 2012

Строки неизменны. Всякий раз, когда вы присваиваете новое значение строковой переменной, каждый раз создается новый экземпляр, поэтому вы не можете видеть обновления в своей коллекции.

Однако .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"
1 голос
/ 19 февраля 2012

Вот идея сделать ваш код проще:

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 всякий раз, когда хотите получить строку по ссылке. Поскольку у нас есть этот неявный оператор, вы можете использовать MyString вместо строки

0 голосов
/ 19 февраля 2012

Нельзя передавать внутренние типы данных по ссылке, они всегда передаются по значению.Внутренние типы включают базовые типы, такие как Int32, String, Bool и т. Д.

...