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. <JZOJ4726>种花

    挺有意思的贪心 神奇的贪心 #include<cstdio> #include<iostream> #include<cstring> #include<al ...

  2. 状压DP小拼盘

    有的DP题,某一部分的状态只有两种,选或不选. 开数组记录,代价太大,转移不方便. 状态压缩意为,用 “0/1“ 表示 “选/不选“ . 把状态表示为二进制整数. There are 10 kinds ...

  3. EROS安装(windows)

    版本查看 基础环境安装 npm i eros-cli -g

  4. java集合 list与Set、Map区别

      1.List,Set都是继承自Collection接口,Map则不是. 2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉 ,(注意:元素虽 ...

  5. frp端口映射穿透内网

    前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...

  6. (转载)SVN使用说明

    为了方便个人使用,转载过来的,如需查阅,请前往原文地址:http://blog.csdn.net/ideal_utopia/article/details/51883796 为什么要使用SVN? 在程 ...

  7. 线程sleep,wait,notify,join,yield方法解析

    线程的五种状态 线程从创建到销毁一般分为五种状态,如下图: 1) 新建 当用new关键字创建一个线程时,就是新建状态. 2) 就绪 调用了 start 方法之后,线程就进入了就绪阶段.此时,线程不会立 ...

  8. PDF 相关操作

    去年一年偷了下懒, 博客写了一点就没写了, 还好一些大的flag完成了.  花了半年的空余时间, 培养了一门兴趣爱好.   自己在为人处世上还是不够圆滑啊, 也难怪.   自己当初选择走技术这条路的初 ...

  9. 用ABAP 生成二维码 QR Code

    除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成 ...

  10. 学习使用Guava Cache

    官方文档:https://github.com/google/guava/wiki/CachesExplained 目录 一.guava cache介绍 二.快速入门 2.1.引入依赖 2.2.第一个 ...