理解C 理解词语的方法有哪些
创始人
2024-05-06 02:30:48
0

有关C# String类型究竟是值类型还是引用类型,在很多C#学习者中都或多或少造成过困惑。好比下面这个例子:

  1. class Class1   
  2. {   
  3.     static void StrChange(string str)   
  4.     {   
  5.       str = "hellow";   
  6.     }   
  7.  
  8.     static void Main()   
  9.     {   
  10.       string str = "123";//申明一个字符串   
  11.       StrChange(str);//调用方法   
  12.       Console.WriteLine(str);//输出字符串   
  13.     }   
  14. }   

输出的结果是 "123" 。

那么,string 到底是值类型还是引用类型?有人会说,如果是值类型,结果倒还说的过去.但是string 的定义不是应该是引用类型么?如果是引用类型的话.输出的结果难度不应该是: "hellow"么?

解答这个问题的关键在于,C# string类型是特殊的引用类型,它的实例是只读的。这个地方要搞清楚语法和实现的区别 。在C#的语法中,

◆static void StrChange(string str) 是值传递

◆static void StrChange(ref string str) 是引用传递

但在实现上,static void StrChange(string str) 这种值传递,在函数体内对str进行修改之前,与函数外部的变量指向同一块内存,是“引用”传递,但在函数体内对str修改后,就会触发对该str重新分配一块内存。

所以说,String 是引用类型,不过是不可变的。对字符串做一些操作(比如大小写的转换、+=), 实际上是重新创建了一个字符串。这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=。

有关C# String类型做为引用类型的特别之处,可以参看下例的示例及注释:   

  1. private void button2_Click(object sender, EventArgs e)   
  2.       {   
  3.           string str="aaa";   
  4.  
  5.           string str1 = str;   
  6.           str = "bbb";//注释掉此名就"yes",否则"no".这就说明str重新赋值的时候,   
  7.           //其实是重新创建了一个名为str的字符串(内存中指向的位置是不同的),先前   
  8.           //的那个str你就再也看不到了.   
  9.           string str2 = str;   
  10.         
  11.             
  12.           
  13.           if (object.ReferenceEquals( str1,str2))   
  14.           {   
  15.               MessageBox.Show("yes");   
  16.           }   
  17.           else   
  18.           {   
  19.               MessageBox.Show("no");   
  20.           }   
  21.       }  

最后回到一开始的那段代码。如果想下面这样编写:

  1. class Class1   
  2. {   
  3.       
  4.     static string StrChange(string str)   
  5.     {   
  6.       str = "hellow";   
  7.         return str;   
  8.     }   
  9.     static void Main()   
  10.     {   
  11.         string str = "123";//申明一个字符串   
  12.         str=StrChange(str);//调用方法   
  13.         Console.WriteLine(str);//输出字符串   
  14.     }   
  15.       
  16. }  

这样输出的便是hellow了。

【编辑推荐】

  1. 关于interface继承来源的讨论
  2. C#显式实现接口原理浅析
  3. C# interface学习经验浅谈
  4. C# interface使用实例分析
  5. 浅析abstract class和interface的不同

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...