附加到字符串

时间:2011-10-07 15:17:29

标签: c# string string-concatenation

URL是一个字符串,为什么我不能这样连接:

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

这是因为string是一个引用类型,它实际上是在尝试将它添加到引用而不是对象中吗?

达到我想要的最佳方式是什么?

6 个答案:

答案 0 :(得分:6)

需要转让

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

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

答案 1 :(得分:3)

+运算符不会更改您在表达式中使用的变量。对于数值,它也不会这样做:

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 :(得分:2)

您可以使用

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

连接到mynewstring或者

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

连接到url

原因是字符串不可变。致quote MSDN

  

字符串是不可变的 - 字符串对象的内容不能   在创建对象后更改,尽管语法可以实现   好像你可以这样做。

答案 3 :(得分:2)

System.String的实例是不可变的:对它们的任何变异操作(包括连接)都将生成带有结果的 new 实例。如果您不使用此值,您将看不到预期的效果:

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

或当然

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

建议:您可能希望使用UriBuilder而不是使用字符串连接来构建您的网址。

答案 4 :(得分:1)

字符串是不可变的,这意味着一旦创建了一个字符串就无法修改它。但是,您可以创建一个新字符串,这正是+运算符应用于字符串时所执行的操作。由于它创建了一个新字符串而不修改现有字符串,因此您需要像其他答案一样分配它。

这适用于所有不可变类型,例如整数,例如

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

答案 5 :(得分:1)

有几个答案提到了不变性,而这不是这个问题。

代码行

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