Добавить к строке - PullRequest
       22

Добавить к строке

1 голос
/ 07 октября 2011

URL - это строка, так почему я не могу объединить так:

string url = "something";
url + string.Format("group={0}&", Id);

Это потому, что строка является ссылочным типом и пытается добавить его к ссылке, а не к объекту?

Как лучше всего добиться того, чего я хочу?

Ответы [ 6 ]

6 голосов
/ 07 октября 2011

Требуется назначение

url += string.Format("group={0}&", Id);

или

url = url + string.Format("group={0}&", Id);
3 голосов
/ 07 октября 2011

Оператор + не меняет переменную, которую вы используете в выражении.Для числового значения это также не выполняется:

int i = 42;
i + 4; // doesn't change the variable i

Необходимо присвоить результат строковой переменной:

url = url + string.Format("group={0}&", Id);

Вы также можете использовать оператор +=, который будет производить точно такой же код времени выполнения:

url += string.Format("group={0}&", Id);

Обратите внимание, что это не меняет строку, а создает новую строку из двух строк.Что на самом деле делает код:

string temp = String.Concat(url, string.Format("group={0}&", Id));
url = temp;
2 голосов
/ 07 октября 2011

Экземпляры System.String являются неизменяемыми: любая операция их изменения (которая включает в себя конкатенацию) приведет к созданию нового экземпляра с результатом.Если вы не используете это значение, вы не увидите ожидаемого эффекта:

string url = "something";
url = url + string.Format("group={0}&", Id);

или, конечно,

url += string.Format("group={0}&", Id);

Предложение: Возможно, вы захотитеиспользовать UriBuilder вместо конкатенации строк для построения вашего URL.

2 голосов
/ 07 октября 2011

Вы можете использовать

var mynewstring = url + string.Format("group={0}&", Id);

Объединить в mynewstring или альтернативно

url += string.Format("group={0}&", Id);

Объединить в url.

Причина в том, что строки неизменны . Для цитата MSDN :

Строки неизменны - содержимое строкового объекта не может быть изменен после создания объекта, хотя синтаксис делает его Похоже, что вы можете сделать это.

1 голос
/ 07 октября 2011

В нескольких ответах упоминается неизменность, и это не то, что это.

Строка кода

a + b; 

Это просто не законно, как отдельное утверждение. Вы получите ошибку

В качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения и новых объектов.

Если сделать System.String изменяемым, это не изменится. Если + мутировать один или оба операнда , это не изменится. Строка кода просто не разрешена.

a = a + b; // legal

Для ясности, вы можете определить свой собственный тип, определить оператор +, внутри метода этого оператора мутировать один из операндов (который, вероятно, рассердит ваших потребителей, изменяемый тип или нет), а затем вернуть его и все же не сделает автономную линию a + b; законной. Вы должны использовать его результат в что-то , которое входит в одно из приведенных выше выражений (присваивание, вызов и т. Д.).

public class Foo
{
    public int Bar;

    public static Foo operator +(Foo a, Foo b)
    {
        a.Bar += b.Bar; // horrible mutation
        return new Foo() { Bar = a.Bar };
    }
}

///

Foo a = new Foo() { Bar = 1 };
Foo b = new Foo() { Bar = 2 };
a + b; // still not legal
1 голос
/ 07 октября 2011

Строки являются неизменяемыми , то есть после создания они не могут быть изменены. Однако вы можете создать новую строку, что в точности и делает оператор + применительно к строкам. Поскольку он создает новую строку и не изменяет существующую, вам нужно будет назначить ее, как указано в других ответах.

Это относится ко всем неизменным типам, таким как целые числа, например,

int i = 2;
i + 2; //i is still 2
i = i + 2; //i is now 4
i += 2; //i is now 6
...