#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. aria2连接网站出现handshake failure问题的分析与解决方法

    aria2是一款轻量级的,支持多协议,跨平台的命令行下载工具,是笔者目前在使用的下载工具,结合uget使用基本上能媲美window下的迅雷工具.在笔者使用过程中,遇到了aria2连接部分网站时出现ha ...

  2. 【代码学习】PYTHON 闭包

    一.闭包 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量 在函数里定义一个函数,不会默认被执行 def test(number): print("-----1-----" ...

  3. [蓝桥杯][基础训练]2n皇后问题

    Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行 ...

  4. 吴裕雄 python 人工智能——基于神经网络算法在智能医疗诊断中的应用探索代码简要展示

    #K-NN分类 import os import sys import time import operator import cx_Oracle import numpy as np import ...

  5. dfs关于按钮问题(flip游戏POJ1753)以及和bfs的区别+板子

    DFS深度搜索:之前一直和bfs的用法搞不太清楚:写了题才能慢慢参透吧,看了别的博客的代码,感觉能更好理解dfs在图中的应用: 这个题目的意思是一个人去救另一个人,找出最短的寻找路径: #includ ...

  6. 使用SSH客户端远程登录Linux主机

    使用SSH客户端远程登录Linux主机(可替代samba.ftp服务) . Linux系统起初就是为多用户而产生的,可以允许多个用户同时登录linux主机各自进行操作,如图1所示: 图1 SSH(Se ...

  7. eclipse配置tomcat后修改server.xml文件(如编码等)无效问题

    我们用eclipse配置好tomcat后,在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml等文件. 修改后重启Tomcat服务器时发现xml文件又被还原了. 因为Tomc ...

  8. ASP.NET Core搭建多层网站架构【10-使用JWT进行授权验证】

    2020/01/31, ASP.NET Core 3.1, VS2019, Microsoft.AspNetCore.Authentication.JwtBearer 3.1.1 摘要:基于ASP.N ...

  9. python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  10. Python web在IIS上发布方法和原理

    Python web应用想要发布使用iis发布有两种方式,这篇文章就为大家介绍一下这两种方式的具体实现: 1.配置HttpPlatform程序 HttpPlatform 模块将套接字连接直接传递到独立 ...