#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. Uva 136 丑数

    n^2暴力就完事,但是上限要高,不然就算不到对应的1500,刘汝佳的写法更好. #include <bits/stdc++.h> using namespace std; const in ...

  2. CUP监测1分钟(60s)的python的matplotlib动态作图

    import matplotlib.pyplot as plt import psutil import time # 第1步,导出通用字体设置 from matplotlib import font ...

  3. 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:Bellman函数、贪心算法与增强性学习网络开发实践

    !pip install gym import random import numpy as np import matplotlib.pyplot as plt from keras.layers ...

  4. Ubuntu mysql 在线安装

    $ sudo apt install mysql-server

  5. idea中使用Autowired注入时报红,但是运行不报错

    在Preferences中如下设置,即可解除报红错误: 将Autowiring for Bean Class的Severity级别设置为Warning

  6. 使用SQL计算宝宝每次吃奶的时间间隔(数据保障篇)

    目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿^_^)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 使用SQL计算宝宝每次吃奶的时间间隔(续) 那么本篇 使用SQL计算 ...

  7. sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解

    很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...

  8. js里常见的三种请求方式$.ajax、$.post、$.get分析

    $.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...

  9. Codeforces Round #600 (Div. 2) - D. Harmonious Graph(并查集)

    题意:对于一张图,如果$a$与$b$连通,则对于任意的$c(a<c<b)$都有$a$与$c$连通,则称该图为和谐图,现在给你一张图,问你最少添加多少条边使图变为和谐图. 思路:将一个连通块 ...

  10. 【SSM 项目】实战总结

           项目源代码