日期:2014-05-18  浏览次数:20796 次

C# 和JAVA中的 String
小弟,刚刚 学习了一些 C#技术, 和Java 技术, 每次遇到string 类型时就很是头疼。
第一 、
C#、Java 中string 都属于引用类型,但是作为参数传递时 ,为什么会当作 值类型来处理?内部机制能说明一下么?
这时,string类型变量 作为参数传递的是 值 还是 地址? C#和Java相同么?

第二、
在形参前 加ref修饰, 这时候 传递的是地址, 这个ref 会改变 数据类型么? 传递机制 求说明一下?

第三、
C#中 stringbuffer 是值类型,还是引用类型
Java中 stringbuffer ,stringbuilder 是值类型还是引用类型

另外 求各位技术牛人,帮小弟分析下这道题 
static void Main(string [] args)
{
  stringbuilder a = new stringbuilder ("A");
  stringbuilder b = new stringbuilder("B");
  operate(a,b);
  console.writeline(a+","+b);
}

static void operate(stringbuilder x,stringbuilder y)
{
  x=new stringbuilder("BBB");
  y=x;
}
输出结果

------解决方案--------------------
也就是说,这个operate方法并没有对x,y的值产生影响。这是一种按值传递引用类型,引用a已经指向一个对象"A”,则不能赋予新的对象"BBB"。string,StringBuilder都是引用类型。若想要按引用传递引用类型,则使用ref关键字。

以上解答限于C#语言中,Java与C#的区别本人不太清楚,但道理应该是相通的。
------解决方案--------------------
第三、
C#中 stringbuffer 是值类型,还是引用类型
Java中 stringbuffer ,stringbuilder 是值类型还是引用类型

引用类型
------解决方案--------------------
C#的string其实并不是不可变的,只是没有给你提供常规方法而已。通过不安全代码、P/Invoke等方式还是可以改变一个string的内容的。