[C#] string 与 String,大 S 与小 S 之间有关字符串的秘密(整理中...)

string 与 String,大 S 与小 S 之间有关字符串的秘密

  字符串是 String 类型的对象,它的值是文本。 在内部,文本被存储为 Char 对象的顺序只读集合。 C# 字符串末尾没有以 null 结尾的字符;因此 C# 字符串可以包含任意数目的嵌入式 null 字符(“\0”)。 字符串的 Length 属性代表它包含的 Char 对象的数量,而不是 Unicode 字符的数量。 若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。

小写 string 与大写 String

  在 C# 中,关键字 string 是 String 的别名。 因此,String 与 string 等效,也就是说您想用哪个就用哪个。String 类提供了很多用于安全地创建、操作和比较字符串的方法。此外,C# 语言还重载某些运算符来简化常见的字符串操作。

声明与初始化 string

  请看示例:

 1         static void Main(string[] args)
 2         {
 3             // 声明但不初始化
 4             string msg1;
 5
 6             // 声明并初始化为 null
 7             string msg2 = null;
 8
 9             // 作为一个空字符串进行初始化,用 Empty(空) 常量而不是字面值的 ""(空)
10             string msg3 = String.Empty;
11
12             // 用正则的字符串字面值进行初始化
13             string oldPath = "c:\\windows";
14
15             // 直接以字符串初始化
16             string newPath = @"c:\windows";
17
18             // 也可以使用 System.String
19             String content = "Hello World!";
20
21             // 使用 const 防止 msg4 被篡改
22             const string msg4 = "I‘m const!";
23
24             // 可以使用隐式类型 var
25             var msg5 = "Hi!";
26
27             // 使用 String 构造器进行初始化
28             char[] letters = { ‘A‘, ‘B‘, ‘C‘ };
29             string alphabet = new String(letters);
30
31             Console.Read();
32         }

  【注意】除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。

  使用 Empty 常量值初始化字符串可新建字符串长度为零的 String 对象。零长度字符串的字符串表示形式为 ""。使用 Empty 值(而不是 null)初始化字符串可以降低发生 NullReferenceException 的可能性。我们常常会在尝试访问字符串之前使用静态 IsNullOrEmpty(String) 方法验证字符串的值。

string 的不可变性

  字符串对象是不可变的:即它们创建之后就无法更改。 所有看似修改字符串的 String 方法和 C# 中的运算符,实际上都以新字符串对象的形式返回结果。 在下面的示例中,当连接 s1 和 s2 的内容以形成一个字符串时,不会修改两个原始字符串。 += 运算符会创建一个包含组合内容的新字符串。 这个新对象赋给变量 s1,而最初赋给 s1 的对象由于没有其他任何变量包含对它的引用而释放,将在后续被垃圾回收。

  示例一:

 1         static void Main(string[] args)
 2         {
 3             var s1 = "Hi!";
 4             var s2 = "Fanguzai!";
 5
 6             //拼接 s1 和 s2,并且修改 s1 指向的值
 7             s1 += s2;   //即 s1 = s1 + s2;
 8
 9             Console.WriteLine(s1);
10             Console.Read();
11         }

  由于“修改”字符串实际上是创建一个新字符串,因此创建对字符串的引用时必须谨慎。 如果创建了对字符串的引用,然后“修改”原始字符串,则该引用指向的仍是原始对象,而不是修改字符串时创建的新对象。

 1         static void Main(string[] args)
 2         {
 3             var s1 = "Hi! ";
 4             var s2 = s1;
 5
 6             //在 s1 重新赋值后,这次没有重新修改 s2 指向的值
 7             s1 += "Fanguzai!";   //即 s1 = s1 + "Fanguzai!";
 8
 9             Console.WriteLine(s2);
10             Console.Read();
11         }

正则 string 与原义 string

string 的转义序列

格式化字符串

操作子字符串

字符串的 null 与 ""(空)

可提高性能的 StringBuilder

  .NET 中的字符串操作已高度优化,大多数情况下不会显著影响性能。但在某些应用场景中,例如在执行数百甚至好几千次的循环中,字符串操作很可能会影响性能。 StringBuilder 类创建了一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。 StringBuilder 字符串还使您能够重新分配个别字符(内置字符串数据类型所不支持的字符)。例如,此代码在不创建新字符串的情况下更改了一个字符串的内容:

1         static void Main(string[] args)
2         {
3             var sb = new StringBuilder("~ Hi! Fanguzai!");
4             sb[0] = ‘^‘;
5
6             Console.WriteLine(sb);
7             Console.Read();
8         }



【博主】反骨仔

【出处】http://www.cnblogs.com/liqingwen/p/6155790.html

【参考】微软官方文档

时间: 2024-10-07 16:26:22

[C#] string 与 String,大 S 与小 S 之间有关字符串的秘密(整理中...)的相关文章

List<string>与string[]

一.是什么? List<>是一个泛型对象,实例化后相当于是一个List对象.List对象内部可以聚合若干个(理论上不限制大小)同类型对象,并提供很多方便的方法来提供一些基本操作,可以理解为一个封装好的链表对象. string[]就是简单的强类型化数组. 二.区别和联系 区别: string[]表示字符串数组,创建后大小固定,不能改变元素的个数. List<string>表示泛型集合,集合中的每个元素都是字符串,创建后可以动态改变元素的个数. 联系: 二者都可以存储数据并且二者可以相

[LeetCode] Rearrange String k Distance Apart 按距离为k隔离重排字符串

Given a non-empty string str and an integer k, rearrange the string such that the same characters are at least distance k from each other. All input strings are given in lowercase letters. If it is not possible to rearrange the string, return an empt

FileOutputStream字节输出流和FileInputStream输入流(切记:out是输出到本地中,in是输入到程序中)这里介绍大文件和小文件的读取方式

//FileOutputStream public class FileOutputStreamDemo { /**字节流:适用于任何文件,以字节为单位,进行读写操作  *字节流操作步骤:  *1.创建文件对象  *2.创建字节流  *3.读写操作  *4.关闭流  */ //字节流(写操作) public static void main(String[] args) { String messageString = "hello world";  byte[] bytes = me

java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”

/* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" *  * 思路: * 1,既然取得是最大子串,先看短的那个字符串是否在长的那个字符串中. *   如果存在,短的那个字符串就是最大子串. * 2,如果不是呢,那么就将短的那个子串进行长度递减的方式取子串,去长串中判断是否存在. *   如果存在就已找到,就不用在找了. * 3.先找最大的子串,再递减子串找,找到,就停止 */ 原理图如图: 代码: publi

大串和小串

首先键盘录入2个字符串 A:定义一个统计变量=0: B:在大串中查找小串是否存在,用 int indexOf(String str):返回指定字符在此字符串中第一次出现处的索引. a:如果返回的索引值是-1,则说明 大串中并不存在这个小串,输出统计变量 b:返回的若不是-1,则是这个小串的第一个字符在大串中的索引,这个时候统计变量++ C:从得到的索引开始,再加上小串的长度,到字符串的最后,开始截取一个新的字符串,再把这个字符串赋值给大串,替换之前的大串 String substring(int

String、String.valueOf、toString 它们三者的区别总结

今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下吧.用了这么长时间,才发现有这些的不同,也是挺惭愧的. 先说他们三的作用是什么吧:没什么特别的作用,就是让我们得到的对象或参数类型,按照要求转成字符串的形式. String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在ja

String = &quot;&quot;和String = null的区别

在这要先说明下 String str;和String str=null;的关系,代码上来说两者几乎不差什么,但是这里String str=null;多了个指向空的引用 而String str ;却只是定义,String str=null比String str多了初始化的内容. 但是String str=null指向的是空引用,在内存里并没有开辟空间,没有实际的内存. 如果通过str调用String的方法,就会报空指针异常. 而通过""这种方式创建字符串,会保存到String类的字符串池

String String Buffer String Builder

Java参数传递 public class TEST{ float ptValue; public void changeStr(String value){ value = new String("different"); } public void changeObjValue(TEST ref){ ref.ptValue = 99.0f; } public static void main(String[] args){ String str; Test pt = new TES

理解Java String和String Pool

本文转载自: http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html 要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable).什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变.java为什么要把String设计为非可变类呢?你可以问问 james Gosling :).但是非可变类确实有着自身的优势