C# 附加到字符串
URL是一个字符串,为什么我不能这样连接:C# 附加到字符串,c#,string,string-concatenation,C#,String,String Concatenation,URL是一个字符串,为什么我不能这样连接: string url = "something"; url + string.Format("group={0}&", Id); 这是因为string是一种引用类型,它实际上试图将其添加到引用而不是对象中 实现我想要的最好方法是什么?您可以使用 var mynewstring = url + string.Format("group={0}&", Id); 交替连接到mynewstringor url += string.Forma
string url = "something";
url + string.Format("group={0}&", Id);
这是因为string是一种引用类型,它实际上试图将其添加到引用而不是对象中
实现我想要的最好方法是什么?您可以使用
var mynewstring = url + string.Format("group={0}&", Id);
交替连接到mynewstringor
url += string.Format("group={0}&", Id);
连接到url
原因是字符串是不可变的。致:
字符串是不可变的。不能更改字符串对象的内容
创建对象后更改,尽管语法使其
看起来好像你能做到这一点
你可以用
var mynewstring = url + string.Format("group={0}&", Id);
交替连接到mynewstringor
url += string.Format("group={0}&", Id);
连接到url
原因是字符串是不可变的。致:
字符串是不可变的。不能更改字符串对象的内容
创建对象后更改,尽管语法使其
看起来好像你能做到这一点
需要分配
url += string.Format("group={0}&", Id);
或
需要分配
url += string.Format("group={0}&", Id);
或
String的实例是不可变的:对它们进行的任何包含串联的变异操作都将生成一个新实例并产生结果。如果不使用此值,将看不到预期效果:
string url = "something";
url = url + string.Format("group={0}&", Id);
当然了
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);
建议:您可能希望使用而不是字符串连接来构建url。字符串是不可变的,这意味着一旦创建了一个字符串,就不能修改它。但是,您可以创建一个新字符串,这正是+运算符应用于字符串时所做的。因为它会创建一个新字符串,并且不会修改现有的字符串,所以您需要像其他答案一样分配它
这适用于所有不可变类型,例如整数,例如
int i = 2;
i + 2; //i is still 2
i = i + 2; //i is now 4
i += 2; //i is now 6
字符串是不可变的,这意味着一旦创建了字符串,就不能对其进行修改。但是,您可以创建一个新字符串,这正是+运算符应用于字符串时所做的。因为它会创建一个新字符串,并且不会修改现有的字符串,所以您需要像其他答案一样分配它
这适用于所有不可变类型,例如整数,例如
int i = 2;
i + 2; //i is still 2
i = i + 2; //i is now 4
i += 2; //i is now 6
+运算符不会更改表达式中使用的变量。对于数值也不会这样做:
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;
+运算符不会更改表达式中使用的变量。对于数值也不会这样做:
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;
有几个答案提到了不变性,但事实并非如此 代码行
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
有几个答案提到了不变性,但事实并非如此 代码行
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
url+=string.Formatgroup={0}&,Id;我相信这也行。@C
似乎我更新我的答案太慢了:-url+=string.Formatgroup={0}&,Id;我相信这也行。@Chad似乎我更新答案太慢了:-谢谢-但为什么会这样?因为字符串是不可变的。url+string.Formatgroup={0}&,Id;创建一个新字符串。字符串是不可变的,因此如果不将新字符串指定给变量,操作将毫无意义。这是因为字符串是不可变的,创建后您无法更改它们,您需要始终创建一个新字符串。这与不可变性无关。字符串可能是完全可变的,但可能是加法运算符+的意外行为导致了突变。无论是否可变,这不是+所做的。它返回操作的结果,而不修改操作数。对于可变类型,您可以定义+运算符来执行此操作,但您可能不想这样做。谢谢-但为什么会这样?因为字符串是不可变的。url+string.Formatgroup={0}&,Id;创建一个新字符串。字符串是不可变的,因此如果不将新字符串指定给变量,操作将毫无意义。这是因为字符串是不可变的,创建后您无法更改它们,您需要始终创建一个新字符串。这与不可变性无关。字符串可能是完全可变的,但可能是加法运算符+的意外行为导致了突变。无论是否可变,这不是+所做的。它返回操作的结果,而不修改操作数。对于可变类型,您可以定义+运算符来完成此操作,但您可能不想这样做。非常感谢您的输入谢谢您的输入