.NET-6-字符串的暂存池|占位符
字符串的暂存池:
public class string的操作
{
/* string类不能被继承,因为他是密闭的,被关键字sealed修饰
*
* 字符串的不可变性,字符串一旦被创建,就不可被修改
* 应为字符串的不可变性,在堆字符串进行拼接操作的时候每次都会重新创建一个对象开辟一个新的空间
* 所以大量字符串操作的时候会很低效
*
* 字符串的暂存池
*
* string类的修饰符为sealed,让string类变成了密闭类,不能被子类继承
* 如果子类继承了string类之后,则可以对string类进行修改,会导致string类的一些特性被改变
* CLR对string类提供了各种特殊逇操作方法,如果有很多类继承了字符串类,则CLR需要对更多的人类提供特殊操作,这有可能会降低效率
*
*/
/// <summary>
/// 字符串的暂存池
/// </summary>
public static void GetString()
{
//这种写法
//因为他们都是新开辟的空间,所以这两个对象不是同一个对象
string s1 = new string(new char[] { 'a', 'b', 'c' });
string s2 = new string(new char[] { 'a', 'b', 'c' });
//下面这种写法
//在创建对象的时候,现在字符串暂存池里面检查是否有"abc"的对象
//如果有则把对象的地址赋值给变量s3,
//如果没有则创建一个新的对象用来存储“abc”,然后把这个新对象的地址赋值给变量s3
//创建s4的对象的时候也是先在暂存池检测,检测到之后把检测到对象的地址赋值给s4
//所以s3和s4指向的都是同一个对象
string s3 = "abc";
string s4 = "abc";
//s7 = "a" + "b" + "c" 等价于 s7="abc"
//所以s5与s7是同一个对象
//s6在操作的时候先计算,然后在给s6赋值
//但是s6在计算的时候,会把abc三个变量传入到方法Concat中,然后计算这3个变量相加的结果
//之后会开辟一个新的空间创建一个新的对象来存储运算结果
//然后把这个新创建的对象的地址赋值给变量s6
//所以s5与s6不是同一个对象,他们指向的是不同的对象地址
//注意s6这里在赋值的时候的时候,是运算结果直接创建对象并把结果保存到这个对象里,然后把做这个对象的地址赋值给变量s6,这里并没有在暂存池里查找
//在这里,直接书写的时候会加入到字符串暂存池里面比如变量abc 和s5,s7
//但是s6这种运算之后的结果不会加入到暂存池里面
//所以如果一个字符串特别长,比如一片文章,不要直接直接写入到一个变量中
//可以通过文档的形式来读取
string s5 = "abc";
string a = "a";
string b = "b";
string c = "c";
string s6 = a + b + c;
string s7 = "a" + "b" + "c";
//在暂存池汇总搜索s6,如果存在则返回他的引用
//如果不存在,则在暂存池中添加该对象,然后返回该引用
string.Intern(s6);
//在暂存池中查找s6,如果存在则返回该引用,如果不存在则返回null
string.IsInterned(s6);
}
占位符的一些使用方式和格式化:
/// <summary>
/// 占位符
/// </summary>
public static void ZWF()
{
//占位符的格式{0,10:d}
//最前面的0表示索引
//后面的,10表示宽度,整数表示右对齐,负数表示左对齐
//:d表示格式
//ps:都有哪些格式,可以在MSDN里面搜索【符合格式】关键字
Console.WriteLine("------------我叫:{0},发了{1}工资------------", "盈盈",123.45678);
Console.WriteLine("------------我叫:{0,10},发了{1,12:C2}工资------------", "盈盈", 123.45678);
Console.WriteLine("------------我叫:{0,-10},发了{1,-12:C2}工资------------", "盈盈", 123.45678);
Console.WriteLine("------------我叫:{0,10},发了{1,12:F2}工资------------", "盈盈", 123.45678);
string str = string.Format("使用{0}的{1}可以组装成一个字符串并返回!", "string类", "Format方法");
Console.WriteLine(str);
}
}
变量abc相加:
//判断字符串是否为空字符串
string str1 = "";//或者str1=null;
if (str1 != null && str1 == "")
{
}
if (str1 != null && str1 == string.Empty)
{
}
//这个最高效
if (str1!=null && str1.Length == 0)
{
}
//或者使用这个,这个和上面的效率相同
if (string.IsNullOrEmpty(str1))
{
}
string.IsNullOrEmpty方法的内部实现: