zoukankan      html  css  js  c++  java
  • [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    目录

    • 小写 string 与大写 String
    • 声明与初始化 string
    • string 的不可变性
    • 正则 string 与原义 string
    • string 的转义序列
    • 格式化字符串
    • 操作子字符串
    • 字符串的 null 与 ""(空)
    • 可提高性能的 StringBuilder 

      字符串是 String 类型的对象,它的值是文本。 在内部,文本被存储为 Char 对象的顺序只读集合。 C# 字符串末尾没有以 null 结尾的字符;因此 C# 字符串可以包含任意数目的嵌入式 null 字符(“”)。 字符串的 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         }

    图:var s1 = "Hi!"; var s2 = "Fanguzai!";

    图: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         }

     

    图:var s1 = "Hi!"; s2 = s1; 他们指向相同的引用地址

    图:s1 = s1 + "Fanguzai!"; 会创建一个没有引用的 "Fanguzai!",并重新修改 s1 指向的值。

    正则 string 与原义 string

      如果必须嵌入 C# 提供的转义符,则应使用正则字符串:

     1         static void Main(string[] args)
     2         {
     3             var coluString = "Col1	Col2	Col3";
     4             var rowString = "Row1
    Row2
    Row3";
     5              
     6             Console.WriteLine(coluString);
     7             Console.WriteLine("=====");
     8             Console.WriteLine(rowString);
     9             Console.Read();
    10         }

      如果字符串文本包含反斜杠字符(例如在文件路径中),为方便起见和提高可读性,应使用原义字符串。由于原义字符串保留换行符作为字符串文本的一部分,因此可用于初始化多行字符串。在原义字符串中嵌入引号时请使用双引号。下面的示例演示原义字符串的一些常见用途:

     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         }

    string 的转义序列

      【备注】编译时,原义字符串转换为所有转义序列均保持不变的普通字符串。因而,如果在调试器监视窗口中查看原义字符串,则看到的将是编译器添加的转义字符,而不是源代码中的原义版本。 例如,原义字符串 @"C: emp.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         }

    操作子字符串

      子字符串是包含在字符串中的任意字符序列。 使用 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         }

    字符串的 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         }

    可提高性能的 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         }

    系列相关

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

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


    【博主】反骨仔

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

    【参考】微软官方文档

  • 相关阅读:
    【Flask教程02】路由基本定义
    Ubuntu16.04下设置静态IP
    实例讲解虚拟机3种网络模式(桥接、nat、Host-only)
    greenplum单机安装
    GreenPlum 基础操作 入门教程
    repo
    RAW nand clear NAND eMMC
    #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针
    LDPC知识点
    宏表达式与函数、#undef、条件编译、
  • 原文地址:https://www.cnblogs.com/liqingwen/p/6155790.html
Copyright © 2011-2022 走看看