思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET/C# 中的字符串类型

Posted on 2010-01-21 00:36  szh114  阅读(1442)  评论(0编辑  收藏  举报

  1:在.NET中,当你定义一个字符串时,通常的情况是系统为你在栈中分配一个变量,这个变量中有一个地址,这个地址指向堆中一块区域,在这儿,放着你定义的那个字符串,当你将这个字符串变量赋一个新值的时候,存放以前字符串的内存块并不发生变化,系统会新分配一块内存,放入你指定的新值,然后将这个新地址放在以前在栈中的那个变量,也就是那个引用型的字符串类的对象中。

  那么旧的那块内存区域呢?就会保留在那儿,但你再也无法使用它,直到某个特定时刻,它会被GC标记为可用,完成回收。

  2:另外要注意,在.NET中,尽管字符串类-String,也就是System.String类,是一个引用型的类型,但是在对字符串进行比较时,却进行的是跟值类型一样的等价比较,也就是说比的是它们指向的那块内存了中的内容,而不是两个地址值。这样的设计是因为字符串类的特殊性,再自然不过了。

  3:还有,因为.NET构架下的字符都采用的是双字节的UNICODE编码,所以由字符构成的字符串自然就是一串UNICODE编码序列。
  4:在C++中会用一个字节表示的0用来标志字符串的结束,.NET中的字符串不再有这个要求,字符串完全不用考虑后面的什么0了。

  5:.NET/C#中,String类是一个sealed类,也就是说,它不允许被拿去继承出新类来!

  6:同C++一样,字符串常量中可以用‘\’转义符,但是.NET提供了一个额外的功能,就是在字符串常量前面加一个@,来表示串中不考虑转义,甚至换行都原照原的能搬到屏幕上,如下:

static void Main(string[] args)
{
string s1 = @"abc
@\n test!
";
Console.WriteLine(s1);
Console.ReadLine();
}

  它的输出结果为:


  7:面对一个字符串,我们可能会想从这个字符串中查找一个特定的字符或子串,或者想按要求取其中一个子串,或者想拿它跟另一个字符串进行比较,或者想将它跟另一个字符串拼接,或者想将这个字符串按某种规则进行排序,更常见的还有要求这个字符串的长度,也就是它当中字符的个数,或者还想将串内字符统一为大写,或者统一为小写,等等。。。那么就来看看.NET框架类库提供的String类型够不够强大。

  (1): public int Length { get; }  

  一定要注意,这个Length是一个属性而不是方法,你要是写一个:Console.Writeline(str.Length()); 出来,是要报编译错的,

  而应该写成: Console.Writeline(str.Length);这样才对。

  注意,这儿的 Length 属性是 只读的!!!而 StringBuilder 的 Length 是可读可写的,当改变StringBuilder类型变量的Length时,会发生截断,或者补长动作!

 

  (2):额,看这个。。。。。

  

      我还是自个熟悉一下各个函数,到时用到的时候再来查吧,,,,,不用看了,MS很强大,.NET/C#很强大。。。。。。

  8:字符串的格式化输出。这个跟C语言中的printf中的'%d'之类的东西功能差不多,但.NET/C#的实现更方便好用一些。有一个String.Format()方法专门来做这个事情。之强大。。。

  9:除了不能改变实例内容的String类以外,.NET/C#还提供了一个System.Text.StringBuilder类,这个以后再细看。