#1 :在.Net Framework中,字符总是表示成16位Unicode的代码
#2 :String 和string 其实是一样的只是表现形式上不同
#3 :string类型被视为基元类型,也就是编译器允许在源代码中直接使用字面值表示字符串,编译器将这些字符串放到模块的元数据中,并在运行时加载和引用它们。

     static void Main(string[] args)
{
string s = "";
Console.WriteLine(s);
Console.ReadLine();
}

il查看如下:

     .method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// 代码大小 21 (0x15)
.maxstack
.locals init ([] string s)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.
IL_0007: ldloc.
IL_0008: call void [mscorlib]System.Console::WriteLine(string)
IL_000d: nop
IL_000e: call string [mscorlib]System.Console::ReadLine()
IL_0013: pop
IL_0014: ret
} // end of method Program::Main

IL指令构造对象的新实例是newobj 上面的IL中并没有newobj IL为 ldstr 也就是CLR 用一种特殊的方式构造了string对象
#4:string 中的 + 操作符的实质

       static void Main(string[] args)
{
string s = ""+"";
Console.WriteLine(s);
Console.ReadLine();
}

如果所有的字符串是字面值,则编译器在编译时连接它们,最终只有一个字符串"23",对于非字面值的字符串使用+操作符,连接则在运行时进行,对于运行时连接不要使用+操作符,这样会在堆上创建多个字符串对象,堆是需要垃圾回收的,对性能有影响,对于这种应使用stringbuilder
#5:字符串是不可变的
string对象一旦创建便不能更改

     static void Main(string[] args)
{
string s = "";
Console.WriteLine(s);
ChangeStr(s);
Console.ReadLine();
}
private static void ChangeStr(string s)
{
s = "";
}

IL代码:

.method private hidebysig static void  ChangeStr(string s) cil managed
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 35 (0x23)
.maxstack
.locals init ([] string s)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.
IL_0007: ldloc.
IL_0008: call void [mscorlib]System.Console::WriteLine(string)
IL_000d: nop
IL_000e: ldloc.
IL_000f: call void ConsoleApp2.Program::ChangeStr(string)
IL_0014: nop
IL_0015: ldloc.
IL_0016: call void [mscorlib]System.Console::WriteLine(string)
IL_001b: nop
IL_001c: call string [mscorlib]System.Console::ReadLine()
IL_0021: pop
IL_0022: ret
} // end of method Program::Main
// 代码大小 9 (0x9)
.maxstack
IL_0000: nop
IL_0001: ldstr ""
IL_0006: starg.s s
IL_0008: ret
} // end of method Program::ChangeStr

虽然string是个对象存放在堆上,但它并不像其他的应用对象一样对它的改变直接反应,通过上面的代码我们的可以发现CLR为每个字符串都创建了对象,这样做的好处:字符串不可变,则操作或访问字符串时不会发生线程同步问题,CLR可通过共享多个完全一致的string内容,这样减少了系统中字符串数量 从而节省内存。
#6 :安全字符串
对于一些敏感数据我们可以使用System.Security.SecureString 该类实现了IDisposable 使用完后可以进行销毁,防止数据的泄露。

C# String 字符串一些关键理解的更多相关文章

  1. 对Java中字符串的进一步理解

    字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...

  2. 【转】String字符串相加的问题

    String字符串相加的问题 前几天同事跟我说我之前写的代码中在操作字符串时候,使用字符串相加的方式而不是使用StringBuffer或者StringBuilder导致内存开销很大.这个问题一直在困扰 ...

  3. 创建String字符串的方式与区别

    Java中创建一个字符串的方式有很多种,常见如: String s = new String("riqi"); String s = "riqi"; 但两者有什 ...

  4. JavaSE 学习笔记之String字符串(十四)

    API:(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源 ...

  5. 数据类型总结——String(字符串类型)

    相关文章 简书原文:https://www.jianshu.com/p/546a755c3eb6 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...

  6. 字符串replace的理解和练习和配合正则表达式的使用

    下面代码展示了(demo地址 https://codepen.io/peach_/pen/jONJjRY): 1.字符串replace的理解和练习和配合正则表达式的使用, 2.正则表达式学习 3.通过 ...

  7. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库

    L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...

  8. String字符串性能优化的探究

    一.背景 String 对象是我们使用最频繁的一个对象类型,但它的性能问题却是最容易被忽略的.String 对象作为 Java 语言中重要的数据类型,是内存中占用空间最大的一个对象,高效地使用字符串, ...

  9. Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0

    课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值  String str=& ...

随机推荐

  1. 豆瓣工程师为你解答关于 Python3 编程方面的问题

    Python是如此活跃的一种语言,几乎伴随互联网的发生而创立,又伴随互联网的极速发展而繁荣.使用Python会遇到这样的问题:什么时候该用多进程?怎样提高代码执行效率?Flask为什么流行?学习Pyt ...

  2. 动手动脑5JAVA项目中的常用的异常处理情况

          Java异常处理的几个原则如下.     (1)不要丢弃异常,捕获异常后需要进行相关处理.如果用户觉得不能很好地处理该异常,就让它继续传播,传到别的地方去处理,或者把一个低级的异常转换成应 ...

  3. 【PAT甲级】1096 Consecutive Factors (20 分)

    题意: 输入一个int范围内的正整数,输出它最多可以被分解为多少个连续的因子并输出这些因子以*连接. trick: 测试点5包含N本身是一个素数的数据,此时应当输出1并把N输出. 测试点5包含一个2e ...

  4. 安卓之图像视图ImageView

    一.有关属性说明 (1)scaleType:指定图形的拉伸类型,默认是fitCenter:拉伸类型的取值如下: (2)src:指定图形来源,src图形按照scaleType拉伸:背景图不按scaleT ...

  5. 使用axios对安卓或者ios低版本兼容性处理

    原因:不支持ES6,无法使用promise 解决办法: 1.安装 es6-promise cnpm install es6-promise --save-dev 2.引入 es6-promise im ...

  6. Vue-footer始终置底

    需求:当页面高度不足一屏时需要footer固定显示在页面底部,而页面内容超过一屏时需要footer紧跟在页面内容的最后. 思路:通过获取 网页可见区域高度:document.body.clientHe ...

  7. JavaSE复习~Java语言发展史

    Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ...

  8. 吴裕雄 python 神经网络——TensorFlow 多线程队列操作

    import tensorflow as tf queue = tf.FIFOQueue(100,"float") enqueue_op = queue.enqueue([tf.r ...

  9. 杭电 2097 sky数

    Sky数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. CDH 搭建 问题

    1.  问题描述: java.sql.SQLException: Access denied for user 'xxx'@'xxx.xxx.xxx.xxx' (using password: YES ...