URL是一个字符串,为什么我不能这样连接:
string url = "something";
url + string.Format("group={0}&", Id);
这是因为string是一个引用类型,它实际上是在尝试将它添加到引用而不是对象中吗?
达到我想要的最佳方式是什么?
答案 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