详解C#中的string与String
目录
- 小写 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
请看示例:
static void Main(string[] args) { // 声明但不初始化 string msg1; // 声明并初始化为 null string msg2 = null; // 作为一个空字符串进行初始化,用 Empty(空) 常量而不是字面值的 ""(空) string msg3 = String.Empty; // 用正则的字符串字面值进行初始化 string oldPath = "c:\\windows"; // 直接以字符串初始化 string newPath = @"c:\windows"; // 也可以使用 System.String String content = "Hello World!"; // 使用 const 防止 msg4 被篡改 const string msg4 = "I'm const!"; // 可以使用隐式类型 var var msg5 = "Hi!"; // 使用 String 构造器进行初始化 char[] letters = { 'A', 'B', 'C' }; string alphabet = new String(letters); Console.Read(); }
【注意】除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。
使用 Empty 常量值初始化字符串可新建字符串长度为零的 String 对象。零长度字符串的字符串表示形式为 ""。使用 Empty 值(而不是 null)初始化字符串可以降低发生 NullReferenceException 的可能性。我们常常会在尝试访问字符串之前使用静态 IsNullOrEmpty(String) 方法验证字符串的值。
string 的不可变性
字符串对象是不可变的:即它们创建之后就无法更改。 所有看似修改字符串的 String 方法和 C# 中的运算符,实际上都以新字符串对象的形式返回结果。 在下面的示例中,当连接 s1 和 s2 的内容以形成一个字符串时,不会修改两个原始字符串。 += 运算符会创建一个包含组合内容的新字符串。 这个新对象赋给变量 s1,而最初赋给 s1 的对象由于没有其他任何变量包含对它的引用而释放,将在后续被垃圾回收。
示例一:
static void Main(string[] args) { var s1 = "Hi!"; var s2 = "Fanguzai!"; //拼接 s1 和 s2,并且修改 s1 指向的值 s1 += s2; //即 s1 = s1 + s2; Console.WriteLine(s1); Console.Read(); }
图:var s1 = "Hi!"; var s2 = "Fanguzai!";
图:s1 = s1 + s2; 重新修改 s1 的指向
由于“修改”字符串实际上是创建一个新字符串,因此创建对字符串的引用时必须谨慎。 如果创建了对字符串的引用,然后“修改”原始字符串,则该引用指向的仍是原始对象,而不是修改字符串时创建的新对象。
static void Main(string[] args) { var s1 = "Hi! "; var s2 = s1; //在 s1 重新赋值后,这次没有重新修改 s2 指向的值 s1 += "Fanguzai!"; //即 s1 = s1 + "Fanguzai!"; Console.WriteLine(s2); Console.Read(); }
图:var s1 = "Hi!"; s2 = s1; 他们指向相同的引用地址
图:s1 = s1 + "Fanguzai!"; 会创建一个没有引用的 "Fanguzai!",并重新修改 s1 指向的值。
正则 string 与原义 string
如果必须嵌入 C# 提供的转义符,则应使用正则字符串:
static void Main(string[] args) { var coluString = "Col1\tCol2\tCol3"; var rowString = "Row1\r\nRow2\r\nRow3"; Console.WriteLine(coluString); Console.WriteLine("====="); Console.WriteLine(rowString); Console.Read(); }
如果字符串文本包含反斜杠字符(例如在文件路径中),为方便起见和提高可读性,应使用原义字符串。由于原义字符串保留换行符作为字符串文本的一部分,因此可用于初始化多行字符串。在原义字符串中嵌入引号时请使用双引号。下面的示例演示原义字符串的一些常见用途:
static void Main(string[] args) { var path = @"C:\Windows"; var text = @"Are you Fanguzai? I'm Fanguzai!"; Console.WriteLine(path); Console.WriteLine("====="); Console.WriteLine(text); Console.Read(); }
string 的转义序列
【备注】编译时,原义字符串转换为所有转义序列均保持不变的普通字符串。因而,如果在调试器监视窗口中查看原义字符串,则看到的将是编译器添加的转义字符,而不是源代码中的原义版本。 例如,原义字符串 @"C:\temp.txt" 在监视窗口中将显示为 "C:\\temp.txt"。
格式化字符串
格式字符串是内容可以在运行时动态确定的一种字符串。采用以下方式创建格式字符串:使用静态 Format 方法并在大括号中嵌入占位符,这些占位符将在运行时替换为其他值。
private static void Main(string[] args) { const string name = "Fanguzai"; var s = string.Format("Hi, {0}!", name); //使用占位符 Console.WriteLine(s); Console.Read(); }
操作子字符串
子字符串是包含在字符串中的任意字符序列。 使用 Substring 方法可以基于原始字符串的一部分创建新字符串。 可以使用 IndexOf 方法搜索子字符串的一个或多个匹配项。 使用 Replace 方法可将指定子字符串的所有匹配项替换为一个新字符串。 与 Substring 方法一样,Replace 实际上返回的也是新字符串,而不修改原始字符串。
private static void Main(string[] args) { const string s1 = "Hi, Fanguzai!"; Console.WriteLine(s1.Substring(4)); //截取 Console.WriteLine(s1.Replace("Hi","Hello")); //替换 Console.WriteLine(s1.IndexOf(",", StringComparison.Ordinal)); //取索引 Console.Read(); }
字符串的 null 与 ""(空)
空字符串是不包含字符的 System.String 对象的实例。 在各种编程方案中经常会使用空字符串表示空白文本字段。 可以对空字符串调用方法,因为它们是有效的 System.String 对象。
var s = string.Empty;
相反,null 字符串并不引用 System.String 对象的实例,任何对 null 字符串调用方法的尝试都会生成 NullReferenceException。 但是,可以在串联和比较操作中将 null 字符串与其他字符串一起使用。
private static void Main(string[] args) { const string s1 = "Hi, Fanguzai!"; string s2 = null; var s3 = string.Empty; var s4 = s1 + s2; //有值的字符串与 null 拼接 Console.WriteLine("s4: {0}", s4); Console.WriteLine(""); var isTrue = (s2 == s3); Console.WriteLine("isTrue: {0}", isTrue); Console.WriteLine(); var s5 = s3 + s2; Console.WriteLine("s5: {0}", s5); Console.WriteLine(); Console.Read(); }
可提高性能的 StringBuilder
.NET 中的字符串操作已高度优化,大多数情况下不会显著影响性能。但在某些应用场景中,例如在执行数百甚至好几亿次的循环中,字符串操作很可能会影响性能。 StringBuilder 类创建了一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。 StringBuilder 字符串可以重新分配个别字符(内置字符串数据类型所不支持的字符)。例如,此代码在不创建新字符串的情况下更改了一个字符串的内容:
static void Main(string[] args) { var sb = new StringBuilder("~ Hi! Fanguzai!"); sb[0] = '^'; Console.WriteLine(sb); Console.Read(); }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持猪先飞!
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25