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

#c# #string #string-concatenation

#c# #строка #конкатенация строк

Вопрос:

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

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

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

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

Ответ №1:

Требуется присвоение

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

или

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

Комментарии:

1. Спасибо — но почему это так?

2. Потому что строки неизменяемы.

3. url string.Format("group={0}amp;", Id); создает новую строку. Строки неизменяемы, поэтому без присвоения новой строки переменной операция бессмысленна.

4. Это потому, что строки неизменяемы, вы не можете изменить их после создания, вам нужно всегда создавать новую.

5. Это не имеет ничего общего с неизменяемостью. Строки могут быть полностью изменяемыми, но это было бы (вероятно, неожиданное) поведение оператора сложения , которое могло бы вызвать мутацию. Изменяемый или нет, это не то, что делает. Он возвращает результат операции без изменения операндов. Для изменяемого типа вы могли бы определить оператор для выполнения именно этого (но вы, вероятно, не захотите).

Ответ №2:

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

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

Вы должны присвоить результат строковой переменной:

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

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

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

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

 string temp = String.Concat(url, string.Format("group={0}amp;", Id));
url = temp;
  

Ответ №3:

Вы могли бы использовать

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

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

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

Для объединения в url .

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

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

Комментарии:

1. url = string.Format("group={0}amp;", Id); я полагаю, что это тоже должно сработать.

2. @Chad кажется, я слишком медленно обновлял свой ответ 🙂

Ответ №4:

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

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

или, конечно

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

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

Ответ №5:

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

Строка кода

 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
  

Ответ №6:

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

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

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