第十四章 字符、字符串、编码

 

一、字符:.NET FrameWork中字符总是表示成16位的 Unicode值。

 二、字符和数字转化有三种方式 直接转化、Convert、IConvertible

 

三、字符串: string  存在于堆上属于引用类型。

字符串拼接建议使用 StringBuilder,因为每次+号拼接会产生额外的内存开销,产生新的字符串。

四、字符串比较:

StringComparison.Ordinal 效率较高,先看字符数数量相等的话才开始比较,否则直接返回false ,这是忽略语言环境的前提下。

System.StringComparer:适合大量字符串,反复执行同一比较。具体机制没有研究。

 

五、字符串留用:简单的说就是为了节省内存消耗,共享字符串。原理是 一个Hash表,表中是一个个字符串,单是实际内存是在堆上。Hash特性 key的唯一性。达到了共享。

 

六、字符串池:编译源码时候将单个字符串多个实例合并成一个。在编译字符串源码插入到元数据时候。元数据中该字符串的引用被修改为,引用同一个字符串实例(就刚被合并过后的那个实例)。这种技术叫做字符串池。而不是和线程池中线城池一样的概念。

 

七、字符串编码: 字节在传输过程中需要编码,响应的接收方需要解码。为了安全、信息不丢失、等等就要编码解码。

抽象类Encoding有个静态属性GetEncoding 静态属性是全局的公用的因此不会构建额外的对象,可以减少GC压力,首选该属性。

           Encoding.GetEncoding("abc");

           System.Text.UnicodeEncoding.GetEncoding("abv");//继承自 抽象类 Encoding

         System.Text.UTF8Encoding.GetEncoding("abv");//继承自 抽象类 Encoding

因此后面的两个是抽象类Encoding的派生类,会产生额外的对象

 

八、字节流编码:System.Net.Sockets.NetworkStream 的编码方式2种方案第一种上面的Encoding来编码,单是Encoding方式获取字节流时候需要是 2的倍数。因此还要利用获取数量的方式然后处理最末尾的字节流是否是2的倍数。因此有一个简单的方式就是Base64:他用System.Convert的静态方法来实施解码编码。

 

 

九、安全字符串:System.Security.SecureString 用法如下

 

 

 

他是在非托管内存中的加密字符串。仅仅在你调用她的 几个属性时候才处于未加密状态,

AppendCahr、InSertAt、RemovAt、SetAt时候。

 

 

posted on 2019-05-14 13:24  无觉-李敏  阅读(199)  评论(0编辑  收藏  举报