C# 基础知识系列- 2 字符串
String的常见方法
String 变量的声明方式
C#中字符串常见的声明有两种:
- 直接使用字面值 即
String s = "12321";
- 使用构造器,即
String s = new String("12321");
string 的特点
String
(字符串)在大多数开发语言中属于不可变量,任何针对String的修改都会生成一个新的字符串。为什么会如此呢,究其原因是String在内存中以类似数组的形式存储字符数据。同时,String
还有一个非常有意思的特点: 字符串在一次声明后,程序会记忆当前已声明的字符串,以备下次使用时不用重新划分内存。
关于这一点有个很有意思(智障)的面试题:
以下三种方式一共生成了几个内存空间:
- string s1 = "sa1234";
- string s2 = "sa"+"1234";
- string s3 = new string(s1);
很多人包括一些老开发都会认为是4个,那么实际上呢,s2和s1同时指向了一个地址也就是两个。
嗯?是不是有点不可思议?
这个是因为在C#中,字面值有一个特点,如果声明过程中一个变量的声明使用的都是字面值(即非变量)或者是常量,那么该变量的声明过程会优先计算值,然后将该变量指向一个常量。
也就是说 在string s2 = "sa"+"1234";
这个表达式中,会先将"sa"和"1234"合并成一个字符串,再赋值给s2。并不会先划分一个"sa"的内存区域,再划分一个"1234"的内存区域,最后再合并成”sa1234“。所以1和2都是直接指向"sa1234"。
string的构造函数
string
的构造函数一共有以下几种:
public String(char c, int count);
public String(char[] value);
public String(char[] value, int startIndex, int length);
- 其他
第一个: 生成数量为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则没有任何指向
判断字符串是否为空:
- 字符串是否是空字符串:
string str = string.Empty;
bool result = str == "" || str == string.Empty || str.Length == 0;
- 字符串是否是空引用:
string str = null;
bool result = str == null;
除了这些繁琐的方法,c# 内部为我们增加了一个默认支持方法:
string.IsNullOrEmpty(value)
该方法验证字符串是否是NULL或者一个空串并返回验证结果
当然,在我们平时开发过程中不只是需要不是一个空串或NULL,还得是一个非空白字符的串。这时候就需要用到这个方法了:string.IsNullOrWhiteSpace(value)
。
更多内容烦请关注我的博客
C# 基础知识系列- 2 字符串的更多相关文章
- C# 基础知识系列- 9 字符串的更多用法(一)
0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...
- C# 基础知识系列- 9 字符串的更多用法(二)
0. 前言 上一篇文章介绍了字符串自身的一些方法,就是对象方法.在字符串体系中,还有一些是string类提供的静态方法.这两部分构成了字符串体系,当然还有一些三方库为字符串提供了扩展方法. 这里简单的 ...
- C# 基础知识系列- 3 集合数组
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...
- C# 基础知识系列-13 常见类库(三)
0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...
- C# 基础知识系列- 14 IO篇 文件的操作 (3)
本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...
- C# 基础知识系列- 14 IO篇 流的使用
0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...
- 基础知识系列☞C#中→属性和字段的区别
"好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
随机推荐
- 数据操作-apply函数族
R 作为一种向量化的编程语言,一大特征便是以向量计算替代了循环计算,使效率大大提升.apply函数族正是为解决数据循环处理问题而生的 -- 面向不同数据类型,生成不同返回值的包含8个相关函数的函数族. ...
- js中对Object对象的一些常用操作总结
前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...
- 解决android 无法打开 DDMS 中的data目录
把上面操作一遍就可以了,如果还是不行你可以检查下 su 是不是输入错误了.
- SQL语言基础及数据库的创建
一.数据类型:1.二进制数据二进制数据以十六进制形式存储.二进制数据最多能存8000个英文字符,4000个汉字字符. 2.字符数据char:存100,不足100补足.varcha:存多少占多少. 3. ...
- find_in_set 函数的语法
find_in_set 函数的语法: FIND_IN_SET(str,strList) str 要查询的字符串 strList 字段名,参数以“,”分隔,如(1,2,6,8) 查询字段(strList ...
- WWW 2015:一个神奇的会议
2015:一个神奇的会议" title="WWW 2015:一个神奇的会议"> 作者:微软亚洲研究院研究员 袁进辉 WWW 2015(24th Internatio ...
- Flutter混合开发:Android接入Flutter
Flutter Google推出已经已经一年多了,单个 Flutter 项目的开发流程已经很成熟了.对与个人开发者来说使用 Flutter 开发一个跨平台的App挺有意思.但是对于现有的项目改造来说还 ...
- XX系统测试总结报告
XX系统测试总结报告 1 引言 1.1 编写目的 编写该测试总结报告主要有以下几个目的 1. 通过对测试结果的分析,得到对软件质量的评价 2. 分析测试的过程,产品,资源,信息, ...
- 迈克尔·乔丹:几百年内AI不会觉醒
此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...
- Oracle的LOB(CLOB)大字段以及(SYS_LOB***$$)清理
文章结构如下: 1.背景: 生产上查询那些大表然后进行清理,然而发现有SYS_LOB0000093441C00002$$这中表段占用30G(只保留一个月,如果保留更久会更大). 2.LOB介绍 Ora ...