String的常见方法

String 变量的声明方式

C#中字符串常见的声明有两种:

  1. 直接使用字面值 即String s = "12321";
  2. 使用构造器,即String s = new String("12321");

string 的特点

String(字符串)在大多数开发语言中属于不可变量,任何针对String的修改都会生成一个新的字符串。为什么会如此呢,究其原因是String在内存中以类似数组的形式存储字符数据。同时,String 还有一个非常有意思的特点: 字符串在一次声明后,程序会记忆当前已声明的字符串,以备下次使用时不用重新划分内存。

关于这一点有个很有意思(智障)的面试题:

以下三种方式一共生成了几个内存空间:

  1. string s1 = "sa1234";
  2. string s2 = "sa"+"1234";
  3. string s3 = new string(s1);

很多人包括一些老开发都会认为是4个,那么实际上呢,s2和s1同时指向了一个地址也就是两个。

嗯?是不是有点不可思议?

这个是因为在C#中,字面值有一个特点,如果声明过程中一个变量的声明使用的都是字面值(即非变量)或者是常量,那么该变量的声明过程会优先计算值,然后将该变量指向一个常量。

也就是说 在string s2 = "sa"+"1234";这个表达式中,会先将"sa"和"1234"合并成一个字符串,再赋值给s2。并不会先划分一个"sa"的内存区域,再划分一个"1234"的内存区域,最后再合并成”sa1234“。所以1和2都是直接指向"sa1234"。

string的构造函数

string的构造函数一共有以下几种:

  1. public String(char c, int count);
  2. public String(char[] value);
  3. public String(char[] value, int startIndex, int length);
  4. 其他

第一个: 生成数量为count的由c组成的字符串,不包括其他字符。

例:string s = new String('a',10);//s="aaaaaaaaaa"

第二个: 将字符数组value转换为字符串,字符串等于字符数组依次连接生成的字符串

例:string s = new String(new char[]{'a','b','c','d','e'});//s = "abcde"

第三个: 将字符数组value中部分元素拼接为字符串

例:

var chars = new char[] {'A', 'V', 'a', 'b', 'c', 'd', 'e'};
var sr = new string(chars, 0, 5);//sr = "AVabc"

第四个:这里面包括了一些不安全代码,即用到了指针。有机会会对这部分进行介绍。

但是,到这里我们发现一个问题,new string(string str)在哪,前面不是使用了一个 new string("12321")吗?

事实是,并没有这个构造函数。那么,当我们使用new string("12321")时,实际上是哪个呢?显然可以看到它走的是 第二种 ,系统将字符串当做字符数组传递给了string的构造函数。这也为我们揭露了string在内存中的存储方式-字符数组。由此可见字符串的不可变性其实跟数组类似。

空字符串

在string类里有一个很有意思的静态属性:string.Empty 。它是一个常量,表示空字符串。空字符串,顾名思义:一个空的字符串,不含任何字符,但是不是NULL。

空字符串与NULL的区别

  • 空字符串是一个长度为0的字符串;NULL没有长度,如果强行获取.Length将抛出异常
  • 空字符串可以调用字符串所有的方法;NULL无法调用字符串对象的任何方法
  • 空字符串指向的是内存中的某一个地址,NULL则没有任何指向

判断字符串是否为空:

  1. 字符串是否是空字符串:
string str = string.Empty;
bool result = str == "" || str == string.Empty || str.Length == 0;
  1. 字符串是否是空引用:
string str = null;
bool result = str == null;

除了这些繁琐的方法,c# 内部为我们增加了一个默认支持方法:

string.IsNullOrEmpty(value)

该方法验证字符串是否是NULL或者一个空串并返回验证结果

当然,在我们平时开发过程中不只是需要不是一个空串或NULL,还得是一个非空白字符的串。这时候就需要用到这个方法了:string.IsNullOrWhiteSpace(value)

更多内容烦请关注我的博客

C# 基础知识系列- 2 字符串的更多相关文章

  1. C# 基础知识系列- 9 字符串的更多用法(一)

    0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...

  2. C# 基础知识系列- 9 字符串的更多用法(二)

    0. 前言 上一篇文章介绍了字符串自身的一些方法,就是对象方法.在字符串体系中,还有一些是string类提供的静态方法.这两部分构成了字符串体系,当然还有一些三方库为字符串提供了扩展方法. 这里简单的 ...

  3. C# 基础知识系列- 3 集合数组

    简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...

  4. C# 基础知识系列-13 常见类库(三)

    0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...

  5. C# 基础知识系列- 14 IO篇 文件的操作 (3)

    本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...

  6. C# 基础知识系列- 14 IO篇 流的使用

    0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...

  7. 基础知识系列☞C#中→属性和字段的区别

    "好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...

  8. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  9. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

随机推荐

  1. CF580D_Kefa and Dishes

    D. Kefa and Dishes time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. 安装 Kali Linux 2018.1 及之后的事

    本文为原创文章,转载请标明出处 目录 制作U盘启动盘 安装 Kali Linux 之后的事 更新源 配置 Zsh 配置 Vim 修改 Firefox 语言为中文 安装 Gnome 扩展 美化 安装 G ...

  3. jQuery的html(),text()和val()比较

    .html()用为读取和修改元素的HTML标签: .text()用来读取或修改元素的纯文本内容: .val()用来读取或修改表单元素的value值: 一看黑体的部分,所以把text和html分为一组, ...

  4. 一致性 Hash 算法分析

    当我们在做数据库分库分表或者是分布式缓存时,不可避免的都会遇到一个问题: 如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少. Hash 取模 随机放置就不说了,会带来很多问 ...

  5. sms短信服务

    短信服务是app,电商类应用的基础功能.典型场景有: 用户注册,发送验证码 用户找回验证,发送验证码 用户账户异常,发送提示 用户账户变化,通知用户 短信服务开发有几个注意点: 供应商选型 短信模板 ...

  6. linux-深度学习环境配置-Centos

    下载Centos 7安装镜像,制作启动优盘. Install CentOS 7 安装CentOS 7. 第一步,配置日期.语言和键盘. 第二步,选择-系统-安装位置,进入磁盘分区界面.选择-其它存储选 ...

  7. SQL语法练习(一)

    查询学习课程"python"比课程 "java" 成绩高的学生的学号;– 思路:– 获取所有有python课程的人(学号,成绩) - 临时表– 获取所有有jav ...

  8. 强制迁移、合区 APP太强势伤害用户同时是否违法?

    APP太强势伤害用户同时是否违法?" title="强制迁移.合区 APP太强势伤害用户同时是否违法?"> 对于经常混迹在国内各大手游的玩家来说,"合区& ...

  9. YOLO 论文阅读

    YOLO(You Only Look Once)是一个流行的目标检测方法,和Faster RCNN等state of the art方法比起来,主打检测速度快.截止到目前为止(2017年2月初),YO ...

  10. 记录一下自己写PHP程序时走过的一些坑

    写在前面: 喔噢,转眼间发现自己正式开发程序(PHP)已经有快有1个月了,一路上走了许多的坑,有时遇到坑的时候真想放弃,但是还是坚持下来了!所以写了这篇文章来帮助那些刚刚接触PHP的小白们.[: )] ...