追加到字符串

本文关键字:字符串 追加 | 更新日期: 2023-09-27 18:10:37

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

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

这是因为字符串是一个引用类型,它实际上是试图将其添加到引用而不是对象吗?

实现我想要的最好的方法是什么?

追加到字符串

需求分配

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

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

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

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;

你可以使用

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

连接到mynewstring

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

连接到url

原因是字符串是不可变的。引用MSDN:

字符串是不可变的——字符串对象的内容不能不可变在对象创建后更改,尽管语法允许这样做表现出你能做到的样子。

System.String的实例是不可变的:任何对它们的变异操作(包括连接)都会产生一个带有结果的新的实例。如果你不使用这个值,你将看不到预期的效果:

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

或者

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

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

有几个答案提到了不可变性,但这并不是不可变性。

代码行

a + b; 

作为单独的语句是不合法的。您将得到错误

只有赋值、call、increment、递减和new对象表达式可以作为语句使用。

使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

字符串是不可变的,这意味着一旦创建了它就不能修改。但是,您可以创建一个新字符串,这正是+操作符在应用于字符串时所做的。因为它创建了一个新的字符串,而不修改现有的字符串,所以你需要像其他答案提到的那样分配它。

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

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