C# 两种string类型详解

来源:互联网 发布:javascript 清空table 编辑:程序博客网 时间:2024/05/22 19:18

1,String类型和string类型

     大家知道,C#中有String何string两种字符串类型。可以从以下几个方面了解其不同。

 

     1,在.NET平台上,string是一种数据类型,String是一个

 

     2,string类型是C#语言本身带的一种类(数据类型,为引用类型),而String是.NET Framework中的类。

 

     3,string类型编译时映射为String类型

 

     4,在c#中,string是关键字,但String不。这表明string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以。

 

     声明一下:下面内容来自http://developer.51cto.com/art/200908/147520.htm,感觉写的非常好,拿过来方便大家学习。,我简单编辑了一下,方便大家看。

 

2,C#的string,特殊的引用类型

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

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

输出的结果是 "123" 。

 

 

      解答这个问题的关键在于,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. string str1 = str;
  5. str = "bbb";//注释掉此名就"yes",否则"no".这就说明str重新赋值的时候,
  6. //其实是重新创建了一个名为str的字符串(内存中指向的位置是不同的),先前
  7. //的那个str你就再也看不到了.
  8. string str2 = str;
  9. if (object.ReferenceEquals( str1,str2))
  10. {
  11. MessageBox.Show("yes");
  12. }
  13. else
  14. {
  15. MessageBox.Show("no");
  16. }
  17. }

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

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

这样输出的便是hellow了。