C#中字符串常见的声明有两种:面试
String s = "12321";
String s = new String("12321");
String
(字符串)在大多数开发语言中属于不可变量,任何针对String的修改都会生成一个新的字符串。为何会如此呢,究其缘由是String在内存中以相似数组的形式存储字符数据。同时,String
还有一个很是有意思的特色: 字符串在一次声明后,程序会记忆当前已声明的字符串,以备下次使用时不用从新划份内存。
关于这一点有个颇有意思(智障)的面试题:c#
如下三种方式一共生成了几个内存空间:数组
不少人包括一些老开发都会认为是4个,那么实际上呢,s2和s1同时指向了一个地址也就是两个。
嗯?是否是有点难以想象?安全
这个是由于在C#中,字面值有一个特色,若是声明过程当中一个变量的声明使用的都是字面值(即非变量)或者是常量,那么该变量的声明过程会优先计算值,而后将该变量指向一个常量。
也就是说 在string s2 = "sa"+"1234";
这个表达式中,会先将"sa"和"1234"合并成一个字符串,再赋值给s2。并不会先划分一个"sa"的内存区域,再划分一个"1234"的内存区域,最后再合并成”sa1234“。因此1和2都是直接指向"sa1234"。函数
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中部分元素拼接为字符串
例:code
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在内存中的存储方式-字符数组。因而可知字符串的不可变性其实跟数组相似。blog
在string类里有一个颇有意思的静态属性:string.Empty
。它是一个常量,表示空字符串。空字符串,顾名思义:一个空的字符串,不含任何字符,可是不是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)
。
更多内容烦请关注个人博客