C#字符串处理机制——作业

来源:互联网 发布:java企业级开发面试题 编辑:程序博客网 时间:2024/05/01 21:44


题目名称

C#字符串处理机制

题目关键字

C#字符串处理

题目录入时间

2013-3-12 12:25:28

题目内容

选做题:C#中的字符串处理

 

要求

1、本题为选做题目;

2、了解、熟悉C#中的字符串的各种特殊处理;

3、了解、熟悉C#中的字符串底层实现,以及扩展应用。

 

内容

1、查阅资料,了解C#中的字符串在内存中的驻留机制;

2、查阅资料,了解C#中对于字符串以下几个声明:

· string myString;

· string myString = String.Empty;

· string myString = "";

以上的声明和后续字符串的使用,究竟有什么不同?

3、据说判断一个字符串的内容是否为空,采用if(0 == myString.Length)的速度是最快的(比if("" == myString) 要快),查阅相关资料,设计一下对应的对比实验。

4、可结合防伪码实验,对比一下,是否运行多次程序后,字符串生成速度会有提高?可设计对应的对比实验。

5、阅读此文章:C#基础知识梳理系列七:字符串,http://www.cnblogs.com/solan/archive/2012/08/03/CSharp07.html

提交内容

1、本题选做

2、把以上三个问题的网上资料整理后,给出链接,并把心得体会一起写在一份word文件中。

3、把对应的对比实验,压缩打包,全部源代码放到rar文件中。






问题链接:

问题1:C#的字符串内存驻留机制——http://kb.cnblogs.com/page/102225/

问题2:””和string.Empty的不同——

http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html

问题3:if (0 == myString.Length)if ("" == myString)——http://blog.knowsky.com/157065.htm

心得体会:

关于C#中字符串的内存分配与驻留池的总结如以下几点:

http://kb.cnblogs.com/page/102225/

1、

String s1 = "Hello";

String s2 = "Hello";                       

//s2和s1的实际值都是Hello

bool same = (object) s1 == (object) s2;

//这里比较s1、s2是否引用了同一个对象实例

//所以不能写作bool same = s1 == s2; 

//因为String类重载了==操作符来比较String对象包含的实际值

2、

使用字面量声明的字符串会进入驻留池,而其他方式声明的字符串并不会进入,也就不会自动享受到CLR防止字符串冗余的机制的好处了。

但是由于s2不是通过字面量声明的,CLR在为sb.ToString()方法的返回值分配内存时,并不会到驻留池中去检查是否有值为Hello的字符串已经存在了,所以自然不会让s2指向驻留池内的对象。

3、

为了让编程者能够强制CLR检查驻留池,以避免冗余的字符串副本,String类的设计者提供了一个名为Intern的类方法。

string s2 = String.Intern(sb.ToString());

4、

使用Intern方法的好处在于,如果Intern方法在驻留池中找到了相同值的字符串,此时虽然在内存中存在两份该字符串的副本(一份是参数,一份是驻留池中的),但是随着时间的流逝,参数所引用的那个副本会被垃圾回收掉,这样对于该字符串内存中就不存在冗余了。

不过同样值得注意的是,使用Intern方法让一个字符串存活于驻留池中也有一个副作用:即使已经不存在任何其它引用指向驻留池中的字符串了,这个字符串仍然不一定会被垃圾回收掉。也就是说即使驻留池中的字符串已经没有用处了,它可能也要等到CLR终结时才被销毁。当您使用Intern方法的时候,也应该考虑到这个特殊的行为。

问题3的对比实验:

使用以下方法可以准确的记录代码运行的耗时。

           System.Diagnostics.Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start(); //  开始监视代码运行时间

            //  you code ....

            stopwatch.Stop(); //  停止监视

            TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间

            double hours = timespan.TotalHours; // 总小时

            double minutes = timespan.TotalMinutes;  // 总分钟

            double seconds = timespan.TotalSeconds;  //  总秒数

            double milliseconds = timespan.TotalMilliseconds;  //  总毫秒数

问题4