(C#问题)不用编译器,看看输出地引用类型地String S2是什么? (29分)

  • 主题发起人 千中元
  • 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
不用编译器,看看输出地引用类型地String S2是什么?
using System;

class StringExample
{
public static int Main()
{
string s1 = "A String";
string s2 = s1;

s1 = "Another string";
Console.WriteLine("s2 is " + s2);
return 0;
}
}
 
"A String" ??????????
如果不是请告诉我为什么,,,谢谢。。。:)
 
改变S1地值对S2没有影响,这与我们期待地引用类型正好相反。
书上是这样解释的:“但是当现在要改变S1地值,而不是替换原来地值时,
堆上就会为新值分配一个新对象。”
改变s1的值如果是“s1 = "Another string";
”,替换原来的值又如何表达?
 
string(System.String) 应该是一种特殊的引用类型.
关于相等运算符,是这样描述的
---尽管 string 是引用类型,但相等运算符(== 和 !=)被定义为比较 string 对象
---(而不是引用)的“值”
我的个人理解是 =赋值操作,实际操作的也应该是值,而不是引用,似乎System.String类内部强制性的
重载了=运算符。
 
这是帮助里的话,先仔细看一遍:
string 是 .NET 框架中 System.String 的别名。而System.String的实例被称为是“不可变的”,
这是由于一旦创建它就无法修改它的值。看似能修改 String 的方法实际上只是返回一个包含
修改内容的新 String。
然后看看代码:
class StringExample
{
public static int Main()
{
string s1 = "A String";
string s2 = s1;

s1 = "Another string";
// 1
Console.WriteLine((object)s1==(object)s2);
Console.WriteLine("s1 is:"+s1+"___"+"s2 is:"+s2);
return 0;
}
}
上面的代码如果把1处注释掉,则结果是
True //说明string是引用类型,因为s2 和 s1的地址相同。
s1 is:A String___s2 is:A String
如果把1处没有注释,则结果是
False //说明string的特殊性--修改 String 的方法实际上只是返回一个包含修改内容的新 String。
//这也说明s2所引用的还是原来的s1,而不是现在的s1
s1 is:Another string___s2 is:A String
 
如果想要达到delphi里对字符串的引用操作可以用StringBuilder :
using System;
using System.Text;
class StringExample
{
public static void Main()
{
StringBuilder s1 = new StringBuilder("Hello World!", 25);
StringBuilder s2=s1;
s1.Remove(0,s1.Length);
s1.Append("let's say yeah!");
Console.WriteLine(s1+" "+s2);
Console.Read();
}
}
 
谢谢诸位,现在有点明白了。
savenight兄你看的帮助是.net自带的还是最新msdn?
 
.net自带的帮助(7cd简体中文正式光盘版)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
772
import
I
D
回复
0
查看
733
DelphiTeacher的专栏
D
顶部 底部