码迷,mamicode.com
首页 > 其他好文 > 详细

字符、字符串和文本的处理之String类型

时间:2018-05-14 00:54:05      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:操作符   有一个   一个   技术分享   开发   \n   元类   应用   没有   

.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";

两种写法生成完全一样的字符串,但后者的可读性更好.

       

字符、字符串和文本的处理之String类型

标签:操作符   有一个   一个   技术分享   开发   \n   元类   应用   没有   

原文地址:https://www.cnblogs.com/GreenLeaves/p/9034148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!