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)

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

最新文章

  1. PHP+JQUEY+AJAX实现分页【转】
  2. 生成的API分析文件太大。我们无法在交付前验证您的API使用信息。这只是通知信息。
  3. Block产生的内存泄露,以及解决方法
  4. ueditor工具栏更改按钮的默认操作
  5. .net 微信分享功能
  6. 16.iOS APP图标和启动画面尺寸
  7. 关于Android中混淆的问题
  8. js返回上一步
  9. Java 8 Stream API Example Tutorial
  10. 【Python@Thread】queue模块-生产者消费者问题
  11. iOS开发之Xib和storyboard对比
  12. 特朗普退出《巴黎协定》:python词云图舆情分析
  13. codeforces 558 E A Simple Task
  14. will not be managed by Spring/ [managed: 15; max: 15]
  15. mysql 的 alter table 操作性能小提示
  16. 【SSL】OV、DV和EV证书的区别
  17. VMware 15 安装 MAC OS 10.13 原版(详细图文教程)
  18. (转)YV12,I420,YUV420P的区别
  19. 一款仿ios7的switches开关按钮
  20. JS内存泄漏排查方法-Chrome Profiles

热门文章

  1. 20181026_队测_Brick Game
  2. 吴裕雄--天生自然 R语言开发学习:广义线性模型(续一)
  3. 项目搭建到Linux--实用笔记
  4. ubuntu采用apt-get安装pure-ftpd
  5. DJI大疆创新招聘-自动化测试工程师
  6. GNS3(1)——OSPF多区域配置
  7. Flink命令行提交job (源码分析)
  8. Class file version does not support constant tag 16 in class file
  9. JavaScript 执行环境以及作用域链
  10. Flutter Widgets 之 SnackBar