string str1 = "123";
string str2 = "456";
string str3 = "789";
string result1 = string.Concat(str1, str2, str3);
string result2 = string.Concat("123", "456", "789");
这里,result1 和 result2 在 MSIL 大概是这样:.locals init ([0] string str1,
[1] string str2,
[2] string str3,
[3] string result1,
[4] string result2)
IL_0000: nop
IL_0001: ldstr "123"
IL_0006: stloc.0
IL_0007: ldstr "456"
IL_000c: stloc.1
IL_000d: ldstr "789"
IL_0012: stloc.2
IL_0013: ldloc.0
IL_0014: ldloc.1
IL_0015: ldloc.2
IL_0016: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_001b: stloc.3
IL_001c: ldstr "123"
IL_0021: ldstr "456"
IL_0026: ldstr "789"
IL_002b: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0030: stloc.s result2
问题:这里只有声明了变量str1,str2,str3,那么在 result2 的那些“字符串常量”(姑且这么叫吧),有没有什么区别?
两者编码方式,是否有什么该注意的?
string str2 = "456";
string str3 = "789";
string result1 = string.Concat(str1, str2, str3);
string result2 = string.Concat("123", "456", "789");
这里,result1 和 result2 在 MSIL 大概是这样:.locals init ([0] string str1,
[1] string str2,
[2] string str3,
[3] string result1,
[4] string result2)
IL_0000: nop
IL_0001: ldstr "123"
IL_0006: stloc.0
IL_0007: ldstr "456"
IL_000c: stloc.1
IL_000d: ldstr "789"
IL_0012: stloc.2
IL_0013: ldloc.0
IL_0014: ldloc.1
IL_0015: ldloc.2
IL_0016: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_001b: stloc.3
IL_001c: ldstr "123"
IL_0021: ldstr "456"
IL_0026: ldstr "789"
IL_002b: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0030: stloc.s result2
问题:这里只有声明了变量str1,str2,str3,那么在 result2 的那些“字符串常量”(姑且这么叫吧),有没有什么区别?
两者编码方式,是否有什么该注意的?
而直接赋值就不会占用内存空间,像楼上说的不够灵活。
string str1 = "123";
和
string str2 = "123";
引用的是同一块内存。
这个说法正确吗?
string str2 = "1234";
bool flag = false;
flag = (str2 == str1);
flag = str1.Equals(str2);
flag = object.ReferenceEquals(str1, str2);
str1 = "12" + "34";
str2 = "1" + "234";
flag = (str2 == str1);
flag = str1.Equals(str2);
flag = object.ReferenceEquals(str1, str2); string s1 = "12";
string s2 = "34";
string s3 = "1";
string s4 = "234"; str1 = s1 + s2;
str2 = s3 + s4;
flag = (str2 == str1);
flag = str1.Equals(str2);
flag = object.ReferenceEquals(str1, str2);
str1 = "12" + "34";
str2 = "1" + "234";
后
仍然跟程序中所有出现的 "1234" 字面值的量在引用上相等.