C# 字符串string
一、引言
在 C# 中,字符串是System.String类的一个引用类型。但与其他引用类型不同的是,C#将字符串视为一个基本类型,它可以申请为一个常量,也可以直接给它赋值。
string关键字是System.String类的别名。
二、函数
初始化:
一般最常用的是下面两种,当然最常用的是第一种:
- string str = "111";
- char[] chs = { 'z','x','s'}; string str = new string(chs);
属性:
|
名称 |
描述 |
|
Length |
字符串长度 |
方法:
|
名称 |
描述 |
|
Insert 插入 |
String Insert(int startIndex, String value); 在字符串的index位置,插入value字符串 |
|
Concat 连接(无分隔符) |
static String Concat(String str0, String str1); |
|
static String Concat(params String[] values); |
|
|
static String Concat(params object[] args); |
|
|
Join 连接(带分隔符) |
static String Join(String separator, params String[] value); 返回一个以separator为间隔符,将value连接起来的字符串 |
|
static String Join(String separator, String[] value, int startIndex, int count); 返回一个从startIndex下标开始的,长度为count,以separator为间隔符,将value连接起来的字符串 |
|
|
Split 分割 |
String[] Split(params char[] separator); 将字符串按照char数组里面的字符分割 |
|
String[] Split(String[] separator, StringSplitOptions options); 将字符串按照string数组里面的字符串分割。 参数: StringSplitOptions是个枚举,None = 0, 包含一个空字符串 。RemoveEmptyEntries = 1,不包括包含空字符串的数组元素 |
|
|
Contains 包含(是否) |
bool Contains(String value); 判断字符串是否包含value |
|
EndsWith 包含(末尾) |
bool EndsWith(String value); 判断字符串末尾时候包含value |
|
bool EndsWith(String value, StringComparison comparisonType); |
|
|
StartsWith 包含(头部) |
bool StartsWith(String value); 判断字符串头部是否包含value |
|
IndexOf 包含(返回下标) |
int IndexOf(String value); 返回字符串包含value的第一个下标 |
|
Replace 替换 |
String Replace(String oldValue, String newValue); 将源字符串中的全部oldValue全部替换成NewValue |
|
Remove 移除 |
String Remove(int startIndex); 将下标为index的数据移除 |
|
Trim 移除两侧的某些字符 |
String Trim(); 移除字符串两侧所有空格 |
|
String Trim(params char[] trimChars); 移除字符串中与数组trimChars匹配的全部字符(两侧) |
|
|
String TrimEnd(params char[] trimChars); 移除字符串中与数组trimChars匹配的全部字符(末尾) |
|
|
String TrimStart(params char[] trimChars); 移除字符串中与数组trimChars匹配的全部字符(头部) |
|
|
ToLower 转换为小写 |
String ToLower(); 将字符串里面的字符全部换成小写 |
|
ToUpper 转换为大写 |
String ToUpper(); 将字符串里面的字符全部换成大写 |
|
Copy 复制 |
static String Copy(String str); 返回一个与源字符串值相同的目标字符串 |
|
Compare 比较 |
Static int Compare(String strA, String strB); 比较strA和strB在字典序中的相对位置。 A在B前,返回-1;A在B后,返回1;A=B,返回0; |
|
Static int Compare(String strA, int indexA, String strB, int indexB, int length); |
|
|
Format 格式转换 |
static String Format(String format, object arg0); 格式转换:如 string Result = string.Format("a={0}", 10); |
|
static String Format(String format, params object[] args); |
|
|
Substring 子串 |
String Substring(int startIndex, int length); 返回源字符串中,以index开始,长度为length的字符串 |
|
IsNullOrEmpty Null或者为空? |
static bool IsNullOrEmpty(String value); 判断字符串是否为Null或者为空 |
三、重点讲解
字符串的不可变特性:(转)
C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。
例如:string str="abc"; str[0]='x'; 这时候,编译器会报错的。不允许这样。
string可以看做是char的只读数组。如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。
常见疑问:“谁说字符串不可变?string s1 = "abc";s1="123",s1这不是变了吗”?
要区分变量名和变量指向的值的区别:程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。
内存分配:
string s1 = "abc"; 这句代码执行完之后,在栈内存中开辟一块内存空间存储字符串变量s1,在堆内存中开辟一块内存空间来存储字符串对象“abc”,字符串变量s1指向字符串对象“abc”,如下图所示

s1="123"; 这句代码执行完之后,在堆内存中再开辟一块内存空间来存储字符串对象“123”,字符串变量s1指向字符串对象“123”,如下图所示:

此时可以看到,字符串变量s1已经指向了新的字符串对象“123”了,字符串对象“abc”已经没有任何的字符串变量指向它了,此时字符串对象“abc”就再也没有用了,当对象一定不再有用的时候GC(垃圾收集器)就可以将对象回收了,所以GC会在一个合适的时机来回收字符串对象“abc”,释放其占用的内存资源。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。
string s2 = s1; 这句代码执行完之后,在栈内存中开辟一块内存空间存储字符串变量s2,字符串变量s2也指向字符串对象“123”

字符串拘留池机构 :(转)
同一个程序中,如果将同一个字符串赋值给多个字符串,系统就会多次分配内存空间,这样不仅浪费内存,也会影响系统性能。
为此,.Net提出了字符串拘留池机制。值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。
使用拘留池后,当CLR启动后,会在内部创建一个容器,该容器的键为字符串的内容,值则时字符串在托管堆上的引用。
这样的话,每次需要分配一个新字符串对象时,在分配内存之前先会检测容器中是否包含了该字符串对象,存在则返回已经存在的字符串对象的引用,不存在的话才会新分配对象,把它添加到内部容器中,然后再返回该对象的引用。
【如果用new分配一个字符串对象 || 动态输入的字符串,字符串拘留池机制不会起作用】
object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)
string.IsInterned(string value) ; 判断value 是否存在在拘留池内。 存在?输出该字符串; 不存在?返回null;
string.Intern(string value); 将value加入到拘留池中
测试:
string s1 = "zxs";
string s2 = "zxs";
string s3 = new string(s1.ToCharArray());
char[] chs = { 'z', 'z', 'z' };
string s4 = new string(chs);
Console.WriteLine("s1 和 s2 是否为同一个对象:" + ReferenceEquals(s1, s2));
Console.WriteLine("s1 和 s3 是否为同一个对象:" + ReferenceEquals(s1, s3));
Console.WriteLine("s3是否在拘留池内:" + string.IsInterned(s3));
Console.WriteLine("s4是否在拘留池内:" + string.IsInterned(s4));
输出结果:
s1 和 s2 是否为同一个对象:True
s1 和 s3 是否为同一个对象:False
s3是否在拘留池内:zxs
s4是否在拘留池内:
C# 字符串string的更多相关文章
- javascript类型系统——字符串String类型
× 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串S ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- 字符串string类型转换成DateTime或DateTime?类型
常用的Convert.ToDateTime方法 //将含有正确日期格式的string类型转换成DateTime类型 string strDate = "2014-08-01"; D ...
- Javascript基础系列之(三)数据类型 (字符串 String)
javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...
- Java基础——数组应用之字符串String类
字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 字符串String类
1. String类是一个密封类.用关键字sealed修饰: 2. 字符串的两个特性: ·不可变性:string类型变量,一旦声明就表明它是不会被改变的.因此,string中的方法对strin ...
- 字符串string和内存流MemoryStream及比特数组byte[]互转
原文:字符串string和内存流MemoryStream及比特数组byte[]互转 字符串string和内存流MemoryStream及比特数组byte[]互转比较 定义string变量为str, ...
- 【stanford C++】字符串(String)与流(Stream)
字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...
随机推荐
- 学习html第一天
网站本身就是软件,软件:一种具有特定功能的程序指令的集合 C/S:C客户端-->S服务器 由程序员开发 客户去下载升级安装,比如魔兽世界 B/S:B浏览器-->S服务器 由程序员开发 ...
- centos7下面搭建lnmp环境
参考大神博客: http://www.linuxzen.com/lnmphuan-jing-da-jian-wan-quan-shou-ce-si-lnmpda-jian-yuan-ma-an-zhu ...
- darknet YOLO 编译使用GPU
Darknet在GPU上运行可以得到500倍的提速,编译使用GPU要求显卡是Nvidia卡并且正确安装了CUDA. GPU环境下的编译配置都是在 /darknet/Makefile 文件中定义的,GP ...
- MySQL 数据底部出现总计字样 第二种办法 纵向合并 20161103
上次在博客http://www.cnblogs.com/Mr-Cxy/p/5923375.html 我们使用了group by with rollup 函数 field自定义排序 来实现添加底部总计字 ...
- 「USACO15FEB」「LuoguP3121」审查(黄金)Censoring (Gold)(AC自动机
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...
- ACM学习历程—HDU 1272 小希的迷宫(并查集)
Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)
Description Let's consider one interesting word game. In this game you should transform one word int ...
- Codeforces 762B USB vs. PS/2 贪心
Codeforces 762B 题目大意: 有a台只有USB接口的电脑,b台PS/2接口的电脑,c台两种接口都有的电脑.每台电脑只用装一个鼠标.给出n个鼠标及其费用,每个鼠标只能使用一遍.在最大化有鼠 ...
- python定时任务:apscheduler的使用(还有一个celery~)
文章摘自:https://www.cnblogs.com/luxiaojun/p/6567132.html 1 . 安装 pip install apscheduler 2 . 简单例子 # codi ...