• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#之CLR内存字符串常量池(string)

C#之CLR内存字符串常量池(string)

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了clr via c#中文版,c#中clr,c#clr,clr via c#中文版 pdf,clr via c#第四版等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C#中的string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorld")这样的重装也说没有的。

我们先来看一个方法:

class Program
{
  static void Main(string[] args)
  {
    String s = "HelloWorld";
    Console.WriteLine(s);
  }
}

</div>

然后我们用ildasm.exe工具把它生成IL语言来看一看它里面是怎么玩的:

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size    15 (0xf)
 .maxstack 1
 .locals init ([0] string s)
 IL_0000: nop
 IL_0001: ldstr   "HelloWorld"
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: call    void [mscorlib]System.Console::WriteLine(string)
 IL_000d: nop
 IL_000e: ret
} // end of method Program::Main

</div>

我们在里面并没有看见newObj(所以我们认为不在堆里面)的指令,只有一个特殊ldstr(load string)指令,它用从元数据获取一个文本常量字符串(字符串常量池)构造一个String对象。这证明了CLR说用一种特殊的方式构造了字符串。

我们再举一个简单例子看看:

class Program
{
  static void Main(string[] args)
  {
    String s = "HelloWorld";
    s = "HelloC#";
    s = "HelloJava";
    String s1= "HelloC#";
    Console.WriteLine(s);
  }
}

</div>

对照这个例子我们来看看内存图是怎么走的:

首先CLR内部机制会在运行这个方法之前就会有"prologue"代码去开辟内存空间,s和s1就说这个时候创建的。

我们创建了一个s的字符串对象,赋值为HelloWorld,把s插入栈,然后内部机制去字符串常量池中找HelloWorld副本,发现没有找到就会创建一个,接着会去保存这个HelloWorld在字符串常量池中的地址(Line1)。然后我们为s对象在赋值为HelloC#,由于同一个对象,栈中不做操作,去字符串常量池中找,没找到则创建,然后修改s所存储的地址(line 2),HelloJava同样的操作。 再创建一个s1的string对象,把s1压入栈,为S1赋值HelloC#,这个时候会去字符常量池中找,找到了就存这个引用。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#利用微软自带库进行中文繁体和简体之间转换的方法
  • C#之CLR内存深入分析
  • C#之CLR内存原理初探
  • C#之CLR内存字符串常量池(string)
  • 重温C# clr 笔记总结
  • 带着问题读CLR via C#(笔记二)类型基础
  • 带着问题读CLR via C#(笔记一)CLR的执行模型

相关文章

  • 2017-05-28C#开发教程之ftp操作方法整理
  • 2017-05-28C#自定义的字符串操作增强类实例
  • 2017-05-28C#批量更新sql实例
  • 2017-05-28在c#中把字符串转为变量名并获取变量值的小例子
  • 2017-05-28WPF中引入WindowsForms控件的方法
  • 2017-05-28string类的使用方法详解
  • 2017-05-28C#中重载相等(==)运算符示例
  • 2017-05-28c# 实现子窗口关闭父窗口也关闭的方法
  • 2017-05-28C#逐行读取文件的方法
  • 2017-05-28使用递归算法求第30位数的值

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c# 网址压缩简单实现短网址
    • js验证电话号码手机号码的正则表达式
    • C#实现多线程写入同一个文件的方法
    • c#完美截断字符串代码(中文+非中文)
    • C#基础之委托用法实例教程
    • C#控制台程序输出等腰三角形并居中显示实例
    • C#中的位操作小结
    • C#将html table 导出成excel实例
    • Windows系统中使用C#读取文本文件内容的小示例
    • C#连接操作 MySQL 数据库实例(使用官方驱动)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有