追加到字符串
本文关键字:字符串 追加 | 更新日期: 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
。
字符串是不可变的——字符串对象的内容不能不可变在对象创建后更改,尽管语法允许这样做表现出你能做到的样子。
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