有关C# String类型究竟是值类型还是引用类型,在很多C#学习者中都或多或少造成过困惑。好比下面这个例子:
成都创新互联作为成都网站建设公司,专注网站建设公司、网站设计,有关企业网站设计方案、改版、费用等问题,行业涉及电动窗帘等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
- class Class1
- {
- static void StrChange(string str)
- {
- str = "hellow";
- }
- static void Main()
- {
- string str = "123";//申明一个字符串
- StrChange(str);//调用方法
- Console.WriteLine(str);//输出字符串
- }
- }
输出的结果是 "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类型做为引用类型的特别之处,可以参看下例的示例及注释:
- private void button2_Click(object sender, EventArgs e)
- {
- string str="aaa";
- string str1 = str;
- str = "bbb";//注释掉此名就"yes",否则"no".这就说明str重新赋值的时候,
- //其实是重新创建了一个名为str的字符串(内存中指向的位置是不同的),先前
- //的那个str你就再也看不到了.
- string str2 = str;
- if (object.ReferenceEquals( str1,str2))
- {
- MessageBox.Show("yes");
- }
- else
- {
- MessageBox.Show("no");
- }
- }
最后回到一开始的那段代码。如果想下面这样编写:
- class Class1
- {
- static string StrChange(string str)
- {
- str = "hellow";
- return str;
- }
- static void Main()
- {
- string str = "123";//申明一个字符串
- str=StrChange(str);//调用方法
- Console.WriteLine(str);//输出字符串
- }
- }
这样输出的便是hellow了。
本文标题:理解C#String类型:特殊的引用类型
当前URL:http://www.shufengxianlan.com/qtweb/news16/33566.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联