C# 字符串知识整理

  1. 系统处理文本的方式

【新知识点】.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()也是不区分文化的比较。网上说是非安全的比较,所以速度最快。

时间: 2024-11-10 08:25:30

C# 字符串知识整理的相关文章

Java基础知识整理(一)

概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以便于自己的学习.作为个.NET程序猿也可以学习Java ,毕竟技多不压身,学习多也要精通. 开发工具 eclipse ,开发java类似.NET 需要装JDK类似.NET Framework. Java开发工具eclipse设置 1.设置字体:window设置: 2.设置快捷键:window--ke

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

js事件(Event)知识整理

事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下 鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮--),则触发mousedown 当设备弹起的时候触发mouseup 目标元素的滚动条发生移动时(滚动滚轮/拖动滚动条..)触发scroll 滚动滚轮触发mousewheel,这个要区别于scroll 鼠标移出元素的那一刻,触发mouseout 事件注册 平常

requirejs入门知识整理

使用模块化开发处理的三大问题: 1.命名冲突:2.繁琐的文件依赖 3.实现异步非阻塞的文件加载,避免网页失去响应 模块化的设计使得JavaScript代码在需要访问“全局变量”的时候,都可以通过依赖关系,把这些“全局变量”作为参数传递到模块的实现体里,在实现中就避免了访问或者声明全局的变量或者函数,有效的避免大量而且复杂的命名空间管理. requirejs以一个相对于baseUrl的地址来加载所有的代码.如果用了data-main属性,则该路径就是baseUrl,baseUrl亦可通过requi

perl重点基础知识整理

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

Linux 动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序,动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //elf

MySQL 索引知识整理(创建高性能的索引)

前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, 只是那些需要尽量避免的糟糕索引对固态硬盘的影响没有机械硬盘那么糟糕. 现在很多公司都将数据库的优化工作都依托于 DBA 去完成,在我看来,这些都应该是程序员必备的技能, 有经验和没经验的程序员在数据库使用起来也有很大的差异,这些差异取决开发人员对索引内部的数据结构认识, 对所有负责的业务熟悉程度,

Spring学习篇:AOP知识整理

AOP知识整理 AOP(Aspect-Oriented Programming):面向切面的编程.OOP(Object-Oriented Programming)面向对象的编程.对于OOP我们已经再熟悉不过了,对于AOP,可能我们会觉得是一种新特性,其实AOP是对OOP的一种补充,OOP面向的是纵向编程,继承.封装.多态是其三大特性,而AOP是面向横向的编程. 面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classe