字符串
-
字面量:就是一种语法糖
- 如:string a = “abcd”;
-
String a = new String(new char[] {‘a’,‘b’,‘c’,‘d’}) //调用构造函数创建
-
可以使用 unicode 编码达到加密的目的
-
使用@可以把地址中的 \ 不再转义
-
字符串中对 + 做了重载使其作用于拼接字符串
StringBuider 可变字符串
大量的字符使用 StringBuider
- 容量默认为16
- 长度 <= 容量
- 当储存的字符串超过容量是会自动扩容。
- 一般是成倍扩容,但考虑到为了节省空间,最后一次扩容比较灵活
StringBuider sb = new StringBuider(); // (括号中是容量) 默认为16
StringBuider 常用API
可变字符串使用移除、替换等 api 会改变自身
- Append //末尾追加
sb.Append('a');
sb.AppendLine(); //末尾追加并换行
sb.AppendFormat("{0,C2}",a); //格式化
-
Insert //在指定位置插入指定字符串
-
- sb.Insert(0, "abc");
-
-
Remover //移除,替换指定字符串
-
sb.Remover("a", "b");
-
-
Clear //清空
字符串内存分配
字符串在堆中有一个单独的空间来处理字符串:
字符串的内存分配细节
C# 编译器会把代码中出现的字符串字面量保存在一个称为“字符串驻留池(intern pool)”的地方。
示例:
string s1 = "hello";
string s2 = "hello";
Console.WriteLine(object.ReferenceEquals(s1, s2)); // 输出 True
说明:s1
和 s2
实际上引用的是同一个字符串实例。
2. 使用 new 创建字符串
string s3 = new string("hello".ToCharArray());
Console.WriteLine(object.ReferenceEquals(s1, s3)); // 输出 False
说明:使用 new
创建会在堆上分配一个新的实例,不在驻留池中。
3. 字符串连接
string a = "he";
string b = "llo";
string c = a + b; // 编译时不可确定,运行时才拼接
Console.WriteLine(object.ReferenceEquals("hello", c)); // False
但使用 const
或字面量连接时,编译器会优化为一个常量,驻留在池中。
字符串API
StringComparison: 字符串比较器
-
Length //获取字符串的长度,即字符串中字符的个数.
-
Chars //在当前 String 对象中获取 Char 对象的指定位置
-
IndexOf //返回整数,找不到返回-1,得到指定的字符串在原字符串中第一次出现的位置(索引).
-
LastlndexOf //返回整数,得到指定的字符串在原字符串中最后一次出现的位置.
-
StartsWith //返回布尔型的值,判断某个字符串是否以指定的字符串开头.
-
EndsWith //返回布尔型的值,判断某个字符串是否以指定的字符串结尾.
-
ToLower //返回一个新的字符串,将字符串中的大写字母转小写字母.
-
ToUpper //返回一个新的字符串,将字符串中的小写字母转换成大写字母.
-
Trim //返回一个新的字符串,不带任何参数时表示将原字符串中前后的空格删除.
-
TrimStart //返回一个新的字符串,将字符串中开头的空格删除
-
TrimEnd //返回一个新的字符串,将字符串中结尾的空格删除
-
Remove //返回一个新的字符串,将字符串中指定范围的字符串移除.
-
Replace //把字符串字串替换为其它字符串
-
Substring //返回一个新的字符串,用于截取指定的字符串.
-
PadLeft //返回一个新的字符串,从字符串的左侧填充空格达到指定的字符串长度.
-
//参数1.填充的数量 //参数2.填充的符号 str.PadLeft(2,*)
-
-
PadRight //返回一个新的字符串,从字符串的右侧填充空格达到指定的字符串长度.
-
Remove //从字符串指定索引开始删除指定长度的字符串,返回一个新字符串
-
Insert //返回一个新的字符串,将一个字符串插入到另一个字符串中指定索引的位置.
-
contain //字符串是否包含某个字符串 (区分大小写)
-
IsNullOrEmpty //判断字符串对象是否为空类型或者是空字符串
-
str.ToCharArray(); //ToCharArray 把字符串分割成字符数组
-
str1.Split(‘,’) //以特殊符号为参考分割字符串为字符串数组
-
Join(" ",a) //把数组组合成字符串 以某个字符串作为组合符号
-
concat (x,y," “) //拼接字符串效果类似于 x+y+” "
-
Clone() //克隆,克隆的是地址,返回的类型是 object
-
Copy() //复制,复制的是值,返回的类型是string
-
CopyTo() //复制的来源,没有返回值
-
参数1:从源字符串哪个索引位置开始复制 参数2:把复制的内容放到那个字符数组中 参数3:把复制的内容在 目标中从哪个位置开始放。 参数4:复制几个字符,不要超过源字符串最大长度 str. CopyTo(1,chars,9,1);
-
Copy是静态方法 CotyTo是实例方法,没有返回值
-
-
Extensions //扩展
-
public static calss StringExtensions { public static string Hello(this String str,int x) //this :扩展到哪个对象上 { return str + x; } }
-
-
Format //字符串格式化
-
string.Format({0,4},"abc") //{参数索引,占的宽度} 索引 0 的字符串,格式化为 4 位,不足用空格补齐
-
-
string.Empty //空字符串
格式化字符串
-
$ //模板字符串
-
string.concat () //字符串拼接
-
string.Format () //格式化API
-
string.Format ("{0:C}",1234) //"{参数位置:格式化字符}",字符串
-
格式化数字
- C或c :Currency 货币格式 //默认保留两位小数
- D或d :Decimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了)
- E或e :Exponent 指数格式
- F或f :保留几位小数位 //四舍五入
- G或g :General 常用格式
- N或n :Number 默认逗号分割千位的数字,比如1234将会被变成1,234
- P或p :Percentage 百分%符号格式 //默认保留两位小数
- R或r :Round-trip 圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字
- X或x :转换为16进制
//例如
Console.WriteLine("{0:C}",1234);
string.Format("{0:C}",1234);
-
0 占位 : 有几个0保留几位整数位
Console.WriteLine("{0:0000}",123.11); //结果: 0123.11
-
‘#’ 数字占位 :
Console.WriteLine("{0:###,##,#}",123.11); //结果: