C# 字符串知识整理
新知识点,只是对于本人来说而已。
- 系统处理文本的方式
【新知识点】.NET Framework
.NET Framework的定义:其包含了一个公共语言运行时(Common Language Runtime),和一个类库
其中有几个概念:
CLI公共语言基础结构(Common Language Interface):CLI定义了可执行代码和运行环境的规范。
运行环境:虚拟运行系统(Virtual Execution System,VES)。
CTS通用类型系统(Common Type System):CTS是CLI的核心。
C# 语言编译后的MSIL其实是CLR指令集。
托管堆:
CLR为应用程序预留了一块内存,此内存块就是托管堆,应用类型都存储在堆中。
【新知识点】Char类型的结构是Unicode字符,其中每个Unicode字符占2个字节(未使用代理对,代理对是有两对2个字节组成)。
【新知识点】值类型和应用类型的区别:值类型包括整型、枚举、字符和结构。引用类型包括类、接口、数组和字符串。对于值类型,编译器在编译的时候已经知道了其数据类型占的内存大小,所以把它分配到一个虚拟的栈中。对于引用类型,只有在运行该代码的时候才知道该类型占多大的内存,所以他需要动态分配,在托管堆中分配,在声明一个引用类型变量是,同时给它赋值了一个引用后,如要该变该变量的值,例如:Apple A= New Apple(); A=New Apple();
这里依次给A赋值了两次,其中,两个New Apple()是产生了两个新的引用。这就是处理字符串时候,string类型的性能限制所在。
【新知识点】在C#中char是有两个字节组成的,跟short的大小一样,是Unicode字符。string类型在存储中实质是char数组,所以string也是Unicode的。在内存中,一般在存储过程中,在第一位存string变量的长度,或者在最后一位新增一个0x00,标识字符串结束。
一些系统为了给字符串分配最小的内存空间,才有高速缓存模式,Microsoft才有BSTR(Binary String)二进制字符串。较长的字符串连接时,在堆分配时间时耗时比较长,这意味着,先连接长度较短的字符串能更好的利用性能。
【新知识点】内置:CLR会自动维护一个“内置池”。内置池的作用,当程序用同样的字符串初始化string变量的时候,CLR只会引用内置池的一个实例。不会在内存中重新分配一个地址。这有利于节省内存,要知道一般string类型的变量都是很大的。内置池是通过散列表实现的,检索内置池的时候是利用散列码,所以速度会很快。运行时创建的字符串,是不会自动内置的。我们可以使用String.Intern(s1),来检查字符串是否是内置的。
2.String类和StringBuilder类
【新知识点】在给一个string类赋新值或者连接的时候,性能损耗主要在两个地方:
内存的重新分配【引用类型】
字符串的复制
主要解决办法:减少字符串引用生成的时候,分配重新空间次数,所以在初始化的时候,预先分配更多的内存空间。【所以会存在内存的浪费】,这是BuilderString类的工作原理。
【新知识点】StringBuilder类有两个属性,一个是Length属性,一个是Capacity属性。Length是表示当前StringBuilder中字符串的长度,其不但可以设定,也可以获取。Capacity属性是表示当前StringBuilder中的容量大小。该容量会随字符串的变化而增大的。
【字符串优化操作技巧】推荐如下的操作技巧
尽量把字符串设置为常量,这样保证使用到内置池,同时最小化所需机器指令的数量。
如果String类能够有效的工作,就不要使用StringBuilder类。
如果要循环建立一个庞大的字符数据库,就使用StringBuilder。
如果需要国际化字符串,那么只能使用Compare()。否者使用CompareOrdinal()方法。
如果自诩知道字符串是否相同,那么就应该使用Equals(),而不是CompareOrdianl()方法。
通常情况下使用方法Equals,而不是“=”运算符。
3. 国际化
【新知识点】Unicode:在不同的国家或者地区中,不同的计算机中,使用不同的字符集,导致同一个字符有不一样的值。这增加了不同电脑之间数据转换的复杂度。为了解决这个问题,Unicode协会为世界上每个书面字符指定了一个位置值。一开始的时候,Unicode编码是有两个字节组成的,能表示65000多个字符,但是不能表示全部的字符。后来发明了一种代理对的东西,使用两对两字节的内存来表示一个字符。
【新知识点】字符中的文化,在全世界中,表示同一种东西有很多不同的符号,例如表示100000元的时候,中国和美国就有如下两种表示方法,系统是根据你自己的PC上设定的字符集来知道其表示形式的。其中有关的一个类就是CultureInfo类。
【新知识点】文化的分类:
不变文化:是一种完全不去文化的文化,很多系统进程需要独立于文化,就是说,该文化下的字符与文化无关。
中立文化:该文化与语言有关,与地区无关。
具体文化:该文化与语言和国家地区相关。中立文化和具体文化的主要区别在于后者提供了具体地区或者国家的相关日期、时间、货币、和数字格式选项的附加信息。
【新知识点】文化在程序中的应用:
CurrentUICulture的值决定了如何加载一个窗体资源。可以是中立文化。
CurrentCulture的值决定了其他方面—日期格式、数字格式、字符串大小写和比较等等。必须是具体文化。
int money = 100000;
Console.WriteLine(money.ToString("C"));
Thread.CurrentThread.CurrentCulture=new CultureInfo("en-US"); //具体文化
Console.WriteLine(money.ToString("C"));
【新知识点】文化与比较
在字符串比较中,可以区分文化和不区分文化。如果不区分文化,那么就按照Unicode码来比较,如果区分文化,那么就按照当前的文化来比较。
对于
string a = "ciao";
string b = "character";
不区分文化的话,明显是a>b。
string a = "ciao";
string b = "character";
if (string.Compare(a, b,true, new CultureInfo("cs-CZ")) < 0)
Console.Write("b>a");
如果当前文化是捷克语的话,那么b>a。
String.CompareOrdinal()是不区分文化的比较。
String.Compare()是区分文化的比较。
String.Equals()也是不区分文化的比较。网上说是非安全的比较,所以速度最快。
C# 字符串知识整理的更多相关文章
- js事件(Event)知识整理
事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下 鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- js事件(Event)知识整理[转]
事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...
- Javascript语言精粹之正则表达式知识整理
Javascript语言精粹之正则表达式知识整理 1.正则表达式思维导图 2.正则表达式常用示例 2.1 移除所有标签,只留下innerText var html = "<p>& ...
- ES6知识整理(4)--数组的扩展
最近工作比较忙,基本每天都会加班到很晚.处理一些客户端兼容问题以及提升用户体验的优化.也将近一周没更文了,现在继续es6的学习总结. 上篇回顾 ES6知识整理(三)--函数的扩展 扩展运算符 形式是3 ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- C++进阶4.C++知识整理
C++知识整理(多益笔试) 20131012 前言: 还是关于笔试知识的整理,主要是面向对象的知识还有一些常见的语法知识. 1.还是C++内存管理的知识 C++中程序的内存分布如下: 栈:向下增长,可 ...
- MySQL 索引知识整理(创建高性能的索引)
前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...
- Redis相关知识整理
Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在 ...
随机推荐
- 辛星分析html中间name和id
差额
朋友们可以新手也能很容易区分id和class,但不一定很容易区分id和name,以下说一下二者的差别和联系. 首先是联系,它们都能够用来标记一个元素,并且能够用JavaScript来操作,可是操作方法 ...
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...
- Setup Git Server in CentOS 6.3
0. Environment: Server machine: CentOS 6.3 x86 Client machine: Windows 10 Pro x86_64 1. Install ssh ...
- JS脚本加载与执行对性能的影响
高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...
- php  性能优化
基础优化 1 不要随便复制变量. 有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包含我)会把提前定义好的变量拷贝到一个名字更简短的变量中,事实上这样做的结果是添加了一倍的内存消耗,仅仅会使程 ...
- HDU 4360 As long as Binbin loves Sangsang spfa
题意: 给定n个点m条边的无向图 每次必须沿着LOVE走,到终点时必须是完整的LOVE,且至少走出一个LOVE, 问这样情况下最短路是多少,在一样短情况下最多的LOVE个数是多少. 有自环. #inc ...
- chromium for android v34 2dcanvas硬件渲染实现分析
这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程. 1.webkit为canvas元素相应的render树节点Rend ...
- CSS+DIV+HTML(一)--HTML总结
一.定义 HTML(Hyper Text Markup Language),标记语言. 二.主要内容: HTML元素分为三类:块级标签.内联标签.可变标签.差别在于: 块级元素:在默认情况下会换行显示 ...
- Blend4精选案例图解教程(四):请给我路径指引
原文:Blend4精选案例图解教程(四):请给我路径指引 路径在界面设计中,可以起到很好的辅助作用,我常常使用它来对元素进行规则排列和非规则排列控制. 本次教程将演示,Blend中路径的常规用法. 1 ...
- quick 2.23 它们的定义c++代码lua与总结的一些细节
它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...