String对内存的分配管理

11 篇文章 0 订阅
1 篇文章 0 订阅

c#String对内存的分配管理

在C#语言中,字符串是System.String类的一个引用类型,但与其他引用类型不同。
C#将字符串视为一个基本类型,它可以申请为一个常量,也可以直接给它赋值。
由于C#中的字符串是由System.String类派生而来的引用对象,因此可以使用String类的方法来对字符串进行各种操作。
	public class OtherClass
    {
        public string teacherOther = "Eleven";
        public string teacherPlus = "Elev" + "en";
    }

引用类型间的内存

	{
	    //string类型是引用类型
	    string teacherOpen = "Eleven";
	    string teacherVip = "Eleven";
	    Console.WriteLine($"object.ReferenceEquals(teacherOpen,teacherVip)==={object.ReferenceEquals(teacherOpen, teacherVip)}");
	    Console.WriteLine($"object.ReferenceEquals(teacherOpen,new OtherClass().teacherOther)==={object.ReferenceEquals(teacherOpen, new OtherClass().teacherOther)}");
	    //正确答案是TT
	    //string类型在内存分配时,使用了享元模式,所以是T
	    //只要是同一个进程,分配Eleven都是同一个内存地址的
	}

部分分配时的内存

{
	Console.WriteLine("***************************************");
	string teacherFormat = string.Format("Ele{0}", "ven");
	string lastPart = "ven";
	string teacherCombination = "Ele" + lastPart;
	
	Console.WriteLine($"object.ReferenceEquals(teacherOpen,teacherFormat)...{object.ReferenceEquals(teacherOpen, teacherFormat)}");
	Console.WriteLine($"object.ReferenceEquals(teacherOpen,teacherCombination)...{object.ReferenceEquals(teacherOpen, teacherCombination)}");
	Console.WriteLine($"object.ReferenceEquals(teacherFormat,teacherCombination)...{object.ReferenceEquals(teacherFormat, teacherCombination)}");
	//正确答案 FFF
	//属于部分分配,变量是编译器不能确定的代码,不能确定是eleven,虽然最终结果是Eleven,但是没法重用。这种方式对内存损耗很严重
}

编译器优化的内存

{
	Console.WriteLine("***************************************");
	string teacherPlus = "Ele" + "ven";
	
	Console.WriteLine($"object.ReferenceEquals(teacherOpen,teacherPlus)...{object.ReferenceEquals(teacherOpen, teacherPlus)}");
	Console.WriteLine($"object.ReferenceEquals(teacherOpen,new OtherClass().teacherPlus)...{object.ReferenceEquals(teacherOpen, new OtherClass().teacherPlus)}");
	Console.WriteLine($"object.ReferenceEquals(teacherPlus,new OtherClass().teacherPlus)...{object.ReferenceEquals(teacherPlus, new OtherClass().teacherPlus)}");
	//正确答案 TTT
   	//编译器优化,string teacherPlus = "Ele" + "ven"; 等同于string teacherPlus = "Eleven";
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值