(8)C#字符串
一、字符串
为什么说string是一个不可变的字符序列。
string a="me"; a="meeeee"; string b="me"
给a赋值"me",然后重新赋值"meeeee"
当执行String a="me";时这段代码开辟了两块内存,一块在栈中存放a,然后另一块在堆中存放数据"me",a指向了me的地址,假设这个地址是A1。
然后执行a="meeeee";当个a重新赋值时,栈不会在开辟新空间,堆中会开辟新空间存放"meeeee"地址A2,此时a不在指向A1而是转向A2。
所以再输出a时它并不是修改了A1里的值而是重新建立了一个A2。
接着String b="me" 会新建一个栈空间b指向了原来存放me的地址A1。
变化下一重新分析遍
string a = "me"; string b = a; Console.WriteLine(a);//me Console.WriteLine(b);//me a = "meeeee";//重新a赋值 Console.WriteLine(a);//meeeee Console.WriteLine(b);//me
首先执行 string a = "me"; 和上边一样开辟了两块内存,一块在栈中存放a,然后另一块在堆中存放数据"me",a指向了me的地址,假设这个地址是A1。
然后 string b = a; 在栈中开辟了一个新空间存放b 然后b也指向了a的地址A1。
最后给a 重新赋值"meeeee"
a = "meeeee";这段代码,用原来的栈a,指向了一个新开辟的空间地址假设他叫A2,里面存放着数据"meeeee".这个栈a不再指向A1.现在指向A1的只有栈b。
String s和 new String 的区别
string s1="hello";
string s2= new String("hello");
String s1 = "hello"; 先在内存中找是不是有"hello" 这个对象,
如果有,就让s1指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello".
String s2=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,
都新建一个对象保存"hello".
刚刚发现两个问题
1、java里String里的S是大写的。而C#里有string和String大小写两种形式。
2、String s2=new String(""); 这句话在java里没有问题,但是在C#里会报错。
C#里String和srting的区别
1、 string是关键字,String是类
2、用C#编写代码的情况下尽量使用小写的string,比较符合规范,如果在追求效率的情况下可以使用大写的String,因为最终通过编译后,小写的string会变成大写的String,可以给编译减少负荷,从而运行效率提高。
"=="和equals的区别
==是比较两个字符串的引用地址是否相同,equals比较的是两者的值是否相同.
null 字符串和空字符串
null 字符串:没有分配内存;空字符串分配了内存,但内存里面没有数据.
string str=sting.empty; //分配了内存,相当于 string str=""; 写成后者比较容易出错, 多在里面加个空格string str=" "; 其他区别暂时不明,总之感觉用前者靠谱点
string str=null;//没分配内存
string.IsNullOrEmpty
当字符串是null或者sting.empty为null是返回真
string a = null; string b = string.Empty; string c = ""; string d = " "; if (string.IsNullOrEmpty(a)) { Console.WriteLine("a字符串为真");//执行 } if (string.IsNullOrEmpty(b)) { Console.WriteLine("b字符串为真");//执行 } if (string.IsNullOrEmpty(c)) { Console.WriteLine("c字符串为真");//执行 } if (string.IsNullOrEmpty(d)) { Console.WriteLine("d字符串为真");//不执行 } Console.ReadLine();
DBNull和null的区别:
??
StringBuilder类
待补
System.Text.Encoding.ASCII.GetString ???
Convert.ToBase64String 方法 图片转字节,字节转字符串
将 8 位无符号整数数组的值转换为其用 Base64 数字编码的等效字符串表示形式。
字符串前加@的意思
加@的意思是告诉系统,@后面的字符串当作正常的字符串解析就好,不用进行转义。如果不加,里面有些字符必须转义后才能正确识别。
例如
string str = "abc\de"; //系统报错
string str =@ "abc\de"; //正确
原样输出字符串
方法
String.Substring 方法
重载
Substring(Int32) 从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。
string s = "abcdefg"; string ss = s.Substring(3);//从字符串的第四位数开始往后截取 Console.WriteLine(ss);
Substring(Int32, Int32) 从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
string s = "abcdefg"; string ss = s.Substring(3,2); Console.WriteLine(ss);
第二个参数表示:从第四位开始,一共截取2个数
运算符重载
string str= "hello"; str += " world";
int转字符时定义输出格式
格式说明符 | 说明 | 示例 | 输出 |
C | 货币 | 2.5.ToString("C") | ¥2.50 |
D | 十进制数 | 25.ToString("D5") | 00025 |
E | 科学型 | 25000.ToString("E") | 2.500000E+005 |
F | 固定点 | 25.ToString("F2") | 25.00 |
G | 常规 | 2.5.ToString("G") | 2.5 |
N | 数字 | 2500000.ToString("N") | 2,500,000.00 |
X | 十六进制 | 255.ToString("X") | FF |
Environment.NewLine ??
字符串切割
1、用字符串分隔:
using System.Text.RegularExpressions; string str="aaajsbbbjsccc"; string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase); foreach (string i in sArray) Response.Write(i.ToString() + "<br>");
输出结果:
aaa
bbb
ccc
2、用多个字符来分隔:
string str="aaajbbbscccjdddseee"; string[] sArray=str.Split(new char[2]{'j','s'}); foreach(string i in sArray) Response.Write(i.ToString() + "<br>");
输出结果:
aaa
bbb
ccc
ddd
eee
3、用单个字符来分隔:
string str="aaajbbbjccc"; string[] sArray=str.Split('j'); foreach(string i in sArray) Response.Write(i.ToString() + "<br>")
输出结果
aaa
bbb
ccc
截取后四位
str.Substring(str.Length - 4, 4)
删除后四位
str.Substring(0,str - 4)
去除字符串中的空格,回车,换行符,制表符
str.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "")
统计某字符出现的数量
string reg = @"(#)";//需要匹配的字串 MatchCollection con = new Regex(reg).Matches(“abg#fsdf#sadg”);
int i=con.count;
c#6.0开始可以简化string.Format的写法
public void p(string name) { Console.WriteLine(string.Format("Hello,{0}",name)); Console.WriteLine($("Hello,{name}"));//C#6.0 }
格式化字符串
string.Format("Today is {0:D}",DateTime.Now);
占位符
格式化 结果 描述
string.Format("{0,4}", 0) 0 不满足指定位数的情况下,在前置插入空格
string.Format("{0,-4}", 0) 0 不满足指定位数的情况下,在后置插入空格
数字格式化
格式化 结果 格式符 描述
string.Format("{0:0.0}", 5) 5.0
string.Format("{0:0.0}", 5.21) 5.2 以四舍五入取值
string.Format("{0:A.0}", 5.21) A5.2
string.Format("{0:A.0}", 0.21) A.2 A可以是任何值,就是在数字前加上一个字符串
string.Format("{0:#.0}", 5.21) 5.2 如果是#号,当整数位不为0时,不显示#
string.Format("{0:#.0}", 0.21) .2 如果是#号,当整数位为0时,不显示0
string.Format("{0:F1}", 4.45) 4.5 F 以四舍五入取值,精确小数位数(默认2位)
string.Format("{0:N3}", 1234567.123456) 1,234,567.123 N 用逗号表示千分符,精确小数位数(默认2位)
string.Format("{0:E3}", 1234567.123456) 1.235E+006 E 科学计数法,精确小数位数(默认全部显示)
string.Format("{0:e3}", 1234567.123456) 1.235e+006 e 科学计数法,只有这种格式才有大小写的区别
string.Format("{0:G}", 1234567.123456) 1234567.123456 G 普通格式,使用E或 F格式取决于哪种格式较简单
string.Format("{0:G2}", 1234567.123456) 1.2E+06 G 使用E格式,数字表示所有数字的个数
string.Format("{0:g2}", 1234567.123456) 1.2e+06 g 使用e格式
string.Format("{0:g2}", 12.123456) 12 g 数字表示所有数字的个数
string.Format("{0:C3}", 12.123456) ¥12.123 C 本地货币格式,精确小数位数(默认2位)
string.Format("{0:P2}", 0.12345) 12.35% P 百分数格式,精确小数位数(默认2位)
进制转换
格式化 结果 格式符 描述
string.Format("{0:D3}", 0x10) 016 D 十进制格式,把整数转换为以10为基数的数,只能是整数
string.Format("{0:X3}", 0xFF) 0FF X 十六进制格式(大写字母)
string.Format("{0:x3}", 15) 00f x 十六进制格式(小写字母)
————————————————
版权声明:本文为CSDN博主「Bridge_go」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/breakbridge/article/details/115727976