是克隆功能不执行克隆?
您是否希望两个独立的字符串包含相同的值?当然,通常您并不希望这样。为什么要浪费内存呢?而且,因为字符串是不可改变的,所以具有相同值的两个单独字符串并没有多大意义。
所以,虽然 String 实现了 IClonable,但 String.Clone 只返回对相同字符串的引用,而不进行克隆。
不过,所有功能都还在:如果您坚持希望拥有字符串的第二个副本,您可以使用静态方法 Copy。请注意,我们将通过两种方法来检查引用的等同性:第一种方法是调用 Object.ReferenceEquals,第二种方法是在 C# 中测试等同性之前将引用强制转换为 object,或者在 Visual Basic 中使用 Is 运算符。
[C#]
string s = "Hello";
string t = (string)s.Clone(); // 不复制;s 和 t 引用同一个字符串
string u = String.Copy(s); // 进行复制,s 和 u 引用不同的对象
string ret = String.Format("s same as t: {0}, s same as u: {1}",
Object.ReferenceEquals(s, t), (object)s == (object)u);
[Visual Basic .NET]
Dim s as string = "Hello"
Dim t as string = CStr(s.Clone()) ' 不复制;s 和 t 引用同一个字符串
Dim u as string = String.Copy(s) ' 进行复制,s 和 u 引用两个对象
Dim ret as string = String.Format("s same as t: {0}, s same as u: {1}", _
Object.ReferenceEquals(s, t), s Is u)
您也可以使用 String.CopyTo 方法,将一个字符串的全部或部分字符复制到字符数组中。(使用接受字符数组作为参数的字符串构造函数,根据字符数组或其中的一部分创建字符串。)
字符串等同/比较方法
可以通过许多方法比较两个字符串。对于等同和不等同比较,主要差别当然在于,是比较引用(两个字符串指向同一对象)还是比较值(两个字符串包含相同的字符)。
对于等同比较和关系比较,另一个主要差别在于,是使用当前环境的排序顺序,还是使用字符串中各个字符的原始序号值。(还有一个较小的差别,即比较时是否区分大小写。)比较的默认设置是使用它们所在线程的当前环境并区分大小写。通常,此设置就是您需要的设置。
== 运算符调用 String.Equals,后者将执行区分环境和大小写的比较。如果您希望使用 C# 比较引用,可以将两个字符串引用都强制转换为 Object,或者使用 Object.ReferenceEquals。在 Visual Basic .NET 中,可以如下所示使用 Is 运算符(在 Visual Basic 中),或者使用 Object.ReferenceEquals。请注意,在这两种语言中,都可以使用 Object.ReferenceEquals。
[C#]
string s = "Hello", t = "there";
bool valueComp = (s == t); // 值比较
bool refComp1 = ((Object)s == (Object)t); // 引用比较
bool refComp2 = Object.ReferenceEquals(s, t); // 引用比较
string ret = String.Format("s == t: {0}, " +
"(object)s == (object)t: {1}, ObjectRefEq(s, t): {2}",
valueComp, refComp1, refComp2);
[Visual Basic .NET]
Dim s as string = "Hello"
Dim t as string = "there"
Dim valueComp as Boolean = s = t ' 值比较
Dim refComp1 as Boolean = s Is t ' 引用比较
Dim refComp2 as Boolean = Object.ReferenceEquals(s, t) ' 引用比较
Dim ret as string = _
String.Format("s = t: {0}, s Is t: {1}, ObRefEq(s, t): {2}", _
valueComp, refComp1, refComp2)
介绍一下常用的几个功能:
Compare(str1,str2)——比较两个字符串 str1,str2的大小,如果大于返回正数,等于返回0,小于返回负数!
IndexOf——定位字符串中第一次出现某个给定字符串的位置
PadLeft和PadRight——在字符串的开始和结尾用指定的字符填充字符串
ToLower和ToUpper把字符串转换为小写或大写形式
Trim——删除首尾空白
String.Replace——用指定的字符替换字符串中的指定字符。
C#中字符串的建立过程:
例如定义变量 strT="Welcome to ";
strT+="www.sinory.com";
程序首先创建一个System.String 类型的对象并初始化为“Welcome to”。此时编译程度会分配足够的内存来保存这个文本串。并用变量strT来表示这个实例。当执行strT+="www.sinory.com"时,系统会创建一个新的实例,并分配足够的内存来保存复合后的文本。然后用变量strT来表示这个新的字符
串,就的字符串被撤消。当要进行大规模的字符替换与调整操作时,使用字符串来操作将严重影响性能。在这中情况下就可以用System.Text.StringBuilder类。
StringBuilder类并没有String 类的功能强大,只提供基本的替换和添加和删除字符串中的文本,但它的工作效率非常高,当定义StringBuilder对象时可以指定内存的内存容量,如果不指定系统就会根据对象初始化时的字符串长度来确定。它有两个主要参数Length和Capacity分别表示字符串的实际长度和字符串占据的内存空间长度。对字符串的修改就是在这个内存中进行的,大大提高了添加和替换的的效率。
如定义:StringBuilder sb=new StringBuilder("Hello,Welcome",100);//初始化对象并设置初始容量为100
sb.Append(" to www.sinory.com");
sb.Replace(old,new);//将old替换为new,作用与String.Replace()一样只是不需要在过程中复制字符。
StringBuilder的成员:
StringBuilder sb=new StringBuilder("www.sinory.com");//定义初值为www.sinory.com的对象。
StringBuilder sb=new StringBuilder(20);初始化容量为20的空对象。
另外StringBuilder还有MaxCapacity属性用来限定对象可以使用的最大容量。默认大约是int.MaxValue(20亿)
可以在使用过程中定义sb.MaxCapacity=value;
sb.Append(),给当前字符串追加字符串。
sb.AppendFormat()——添加特定格式的字符串
sb.Insert()——插入一个子字符串
sb.Remove()——从当前字符串删除字符
sb.Replace()——替换字符串中指定的字符
sb.ToString()——将sb转化为String 对象