前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符、字符串和文本的处理之String类型

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

作者头像
郑小超.
发布2018-05-28 18:02:15
8440
发布2018-05-28 18:02:15
举报
文章被收录于专栏:GreenLeavesGreenLeavesGreenLeaves

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档