新知识点,只是对于本人来讲而已。 数据库
【新知识点】.NET Framework数组
.NET Framework的定义:其包含了一个公共语言运行时(Common Language Runtime),和一个类库缓存
其中有几个概念:安全
CLI公共语言基础结构(Common Language Interface):CLI定义了可执行代码和运行环境的规范。性能
运行环境:虚拟运行系统(Virtual Execution System,VES)。优化
CTS通用类型系统(Common Type System):CTS是CLI的核心。ui
C# 语言编译后的MSIL实际上是CLR指令集。编码
托管堆:spa
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()也是不区分文化的比较。网上说是非安全的比较,因此速度最快。