[C#] string 与 String,大 S 与小 S 之间一直不什么样不可言说的秘闻

string 与 String,大 S 与小 S 之间一贯不什么样不可言说的机要

目录

  • 小写 string 与大写 String
  • 声称与开首化 string
  • string 的不可变性
  • 正则 string 与原义 string
  • string 的转义连串
  • 格式化字符串
  • 操作子字符串
  • 字符串的 null 与 “”(空)
  • 可加强性能的
    StringBuilder 

 

  字符串是 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

 

图片 2

图:var s1 = “Hi!”; var s2 = “Fanguzai!”;

图片 3

图:s1 = s1 + s2; 重新修改 s1 的指向

 

   由于“修改”字符串实际上是开创一个新字符串,由此创建对字符串的引用时必须小心。
假若创设了对字符串的引用,然后“修改”原始字符串,则该引用指向的仍是原始对象,而不是修改字符串时成立的新目的。

 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         }

图片 4

 图片 5

图:var s1 = “Hi!”; s2 = s1; 他们针对相同的引用地址

图片 6

图:s1 = s1 + “Fanguzai!”; 会创制一个从未引用的 “Fanguzai!”,一碗水端平新修改
s1 针对的值。

 

正则 string 与原义 string

  如若必须置于 C# 提供的转义符,则应利用正则字符串:

 1         static void Main(string[] args)
 2         {
 3             var coluString = "Col1\tCol2\tCol3";
 4             var rowString = "Row1\r\nRow2\r\nRow3";
 5              
 6             Console.WriteLine(coluString);
 7             Console.WriteLine("=====");
 8             Console.WriteLine(rowString);
 9             Console.Read();
10         }

图片 7

 

  假设字符串文本包含反斜杠字符(例如在文件路径中),为便于起见和加强可读性,应采纳原义字符串。由于原义字符串保留换行符作为字符串文本的一局部,由此可用来起始化多行字符串。在原义字符串中置放引号时请使用双引号。下边的演示演示原义字符串的局部周边用途:

 1         static void Main(string[] args)
 2         {
 3             var path = @"C:\Windows";
 4             var text = @"Are you Fanguzai?
 5                         I'm Fanguzai!";
 6              
 7             Console.WriteLine(path);
 8             Console.WriteLine("=====");
 9             Console.WriteLine(text);
10             Console.Read();
11         }

图片 8

 

string 的转义序列

图片 9

 

  【备注】编译时,原义字符串转换为保有转义连串均保持不变的常见字符串。由此,假设在调试器监视窗口中查看原义字符串,则看到的将是编译器添加的转义字符,而不是源代码中的原义版本。
例如,原义字符串 @”C:\temp.txt” 在监视窗口中校体现为 “C:\\temp.txt”。

 

格式化字符串

  格式字符串是内容可以在运转时动态确定的一种字符串。接纳以下措施开创格式字符串:使用静态 Format 方法并在大括号中置放占位符,这么些占位符将在运转时替换为其他值。

1         private static void Main(string[] args)
2         {
3             const string name = "Fanguzai";
4             var s = string.Format("Hi, {0}!", name);  //使用占位符
5 
6             Console.WriteLine(s);
7 
8             Console.Read();
9         }

图片 10

 

操作子字符串

  子字符串是含有在字符串中的任意字符连串。
使用 Substring 方法可以依照原始字符串的一局部创制新字符串。
能够使用 IndexOf 方法搜索子字符串的一个或四个匹配项。
使用 Replace 方法可将指定子字符串的装有匹配项替换为一个新字符串。
与 Substring 方法一致,Replace 实际上重返的也是新字符串,而不修改原始字符串。

 1         private static void Main(string[] args)
 2         {
 3             const string s1 = "Hi, Fanguzai!";
 4 
 5             Console.WriteLine(s1.Substring(4));  //截取
 6             Console.WriteLine(s1.Replace("Hi","Hello"));  //替换
 7             Console.WriteLine(s1.IndexOf(",", StringComparison.Ordinal));  //取索引
 8 
 9             Console.Read();
10         }

图片 11

 

字符串的 null 与 “”(空)

  空字符串是不带有字符的 System.String 对象的实例。
在各个编程方案中日常会使用空字符串表示空白文本字段。
可以对空字符串调用方法,因为它们是可行的 System.String 对象。 

    var s = string.Empty;

  相反,null 字符串并不引用 System.String 对象的实例,任何对 null
字符串调用方法的尝试都会生成 NullReferenceException。
不过,可以在串联和相比较操作军长 null 字符串与任何字符串一起利用。 

 1         private static void Main(string[] args)
 2         {
 3             const string s1 = "Hi, Fanguzai!";
 4             string s2 = null;
 5             var s3 = string.Empty;
 6 
 7             var s4 = s1 + s2;  //有值的字符串与 null 拼接
 8             Console.WriteLine("s4: {0}", s4);
 9             Console.WriteLine("");
10 
11             var isTrue = (s2 == s3);
12             Console.WriteLine("isTrue: {0}", isTrue);
13             Console.WriteLine();
14 
15             var s5 = s3 + s2;
16             Console.WriteLine("s5: {0}", s5);
17             Console.WriteLine();
18 
19             Console.Read();
20         }

图片 12

 

可增强性能的 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         }

图片 13

 

洋洋洒洒相关

  《C# 知识回顾 –
类别化

  《C# 知识回顾 – 表达式树 Expression
Trees

  《C# 知识回顾 – 特性
Attribute
》、《浅析
AssemblyInfo.cs – 领会常用的特征
Attribute

  《C# 知识回顾 – 委托
delegate
》、《C#
知识回顾 – 委托 delegate
(续)

  《C# 知识回顾 –
事件入门

 

 


【博主】反骨仔

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

【参考】微软官方文档

相关文章