.Net Framework中处理字符和字符串的主要有以下这么几个类:
(1)、System.Char类 一基础字符串处理类
(2)、System.String类 一处理不可变的字符串(一经创建,字符串便不能以任何方式修改)
(3)、System.Text.StringBuilder类 一更高效地构建字符串
(4)、System.Secureity.SecureString类 一对字符串进行保护操作,它可以保护密码和信用卡资料等敏感字符串.
一、String类型
1、简介
在任何应用程序里面,String类型都是用的最多的类型之一.一个String代表一个不可变的(immutable)的顺序字符串,String类型直接派生自Object,所以它是应用类型.所以String对象(它的字符串数组)总是存在于堆上,永远不会跑到线程栈.
C#将String视为基元类型,C#编译器允许在源代码中直接使用字面值字符串.编译器将这些字符串存放到模块的元数据中,并在运行时加载和引用它们.
C#不允许使用new操作符从字面值字符串构造String对象,代码如下:
相反,必须使用以下简化语法:
编译代码并检查IL(使用ILDasm.exe),会看到以下内容:
用于构造对象新实例,但上述代码中并没有出现newobj指令,有一个特殊的ldstr(即 load string)指令,它使用从元数据获得的字面值(literal)字符串构造String对象.这证明CLR实际是用一种特殊方式构造字面值String对象
如果使用不安全的(unsafe)代码,可以从一个Char*或Sbyte*参数构造一个String.这时要使用C#的new操作符,并调用由String类型提供的、能接受Char*或Sbyte*参数的某个构造器.这些构造器将创建String对象,根据由Char实例或有符号(signed)字节构成的一个数组来初始化字符串。其他构造器则不允许接受任何指针参数,用任何托管编程语言写的安全(可验证)代码都能调用它们.
2、关于特殊字符的处理:
C#提供了一些特殊的语法来帮助开发人员在源代码中输入字面值(literal)字符串,对于换行符、回车符和退格符这样的特殊字符,C#采用的是C/C++开发人员熟悉的转移机制,代码如下:
//包含回车符和换行符的字符串 string s="Hi\r\nthere.";
3、关于字符串连接的问题
string s="Hi"+" "+"there .";
在上述代码中,由于所有字符串都是字面值,所以C#编译器能在编译时连接它们,最终将一个字符串即(即"Hi there.")放到模块的元数据中.对非字面值字符串使用+操作符,连接则在运行时进行.运行时连接不要用+操作符,因为这样会在堆上创建多个字符串对象,而堆是需要垃圾回收的,对性能有影响.相反,应该使用StringBuilder类型.
4、字符串@转义符
C#提供了一种特殊的字符串声明方式.采取这种方式,印号之间的所有字符都会被视为字符串的一部分.这种特殊声明称为"逐字字符串",通常用于指定文件或目录的路径,或者与正则表达式配合使用。以下代码展示了如何使用和不适用逐字字符串字符(@)来申明同一个字符串,代码如下:
//指定应用程序路径,使用\解析‘\‘ string file="C:\\Windows\\System32\\Notpad.exe"; //使用逐字字符串制定应用程序路径 string file=@"C:\Windows\System32\Notepad.exe";
两种写法生成完全一样的字符串,但后者的可读性更好.
原文地址:https://www.cnblogs.com/GreenLeaves/p/9034148.html