.net 细节问题

一varchar ()、char(最长2000个字符)和nvarchar(值介于1与4000之间)的区别

1varchar 比char节省空间,效率上比char稍微差一些。(以空间换效率)。如果varchar经常被修改且数据长度不同,用varchar代替varchar会更好一些。

2 nvarchar和varchar的区别是存储方式不同,varchar是按字节存储的,而nvarchar的是按字符存储的。

比如说 varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节.所以varchar(40)只能存储20个中文字符. 
  nvarchar(40),就可以存储40个中文字符,也就是说可以存储80个字节长度的字符.nvarchar要相对于存储的字符类型.比如有些字符是占3个字节的. 
同样的,char和nchar也一样道理。
3char是定长的,如char(8),你输入的字符小于8时,它会在后面补空值。 varchar是变长型且非Unicode,它的存储空间会跟你输入的实际字符数而改变,但最大长度不能超过你指定的长度。nvarchar是unicode 的变长型,它和varchar的区别主要是存储空间大,相同长度下能容内更多字符。 varchar和nvarchar输入数据字符长度可以为零。

 二 UTF-8 GBK UTF8 GB2312之间的区别和关系

1UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF-8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

2GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1.GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

3GB2312(1980年) 一共收录了7445个字符。

1995年汉字扩展规范GBK1.0收录了21886个符号,(分为汉字区和图形符号区)。汉字收录了21003个字符。按程序员的称呼 GB2312\GBK都属于双字节字符集(DBCS)。

2000年GB18030是取代GBK1.0的正式国家标准。采用单字节、双字节(单、双字节和GBK是完全兼容的)和4字节(收录CJK扩展A的6582个汉字)方案。收录27484个汉字,在汉字的基础上增加了GJK(将中日韩三国语言中的文字统一编码),同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

4区位码

5联系:GBK GB2312等于UTF8之间都必须通过Unicode编码才能相互转换。

(主意:如果GBK要转UTF-8必须先转unicode,再转UFT-8)

1早期的计算机使用7位ASCII编码,为了处理汉字,程序员设计了用于简体的GB2312和用于繁体中文的big5.

2GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

 三构造函数和析构函数

注意:在.net里,系统会自动执行析构函数。

1构造函数:特点:a它的命名方法既简单又合理:让构造函数与类同名。b构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同,可以被重载。(注意:在访问类时,自己不写一个构造函数,也会有一个缺省构造函数提供你。例子:class tase{public tase():base(){}//由CLR(公共语言运行时)提供})

2析构函数: 函数名称是在类名的前面加上“~”;它没有返回值,也没有参数。一个类中只能拥有一个析构函数,析构函数不能重载。

析构顺序: 对象被析构的顺序与其创建时的顺序正好相反,即最后构造的对象最先被析构,后进先出,先进后出。

四对象

const类名 对象名特点:1常对象在定义时必须进行初始化,在程序中不能再对其进行更新。2通过常对象只能调用类中的长成员函数,而不能调用类中的其他成员函数。

2常成员函数

使用const说名的成员函数成为常成员函数。

类型 函数名(形参数)const;  特点:1常成员函数为类的只读函数,这种成员函数可以读取数据成员的值,但不可以更新数据成员的值,它也不能调用该类中没有const修饰的其他成员函数。2实现部分中看过也要带上const关键字。3常数成员函数定义中的const关键字可以参与区分重载函数。

 五垃圾回收机制

概念:是一种自动释放内存的垃圾回收机制。程序员可能会影响到垃圾回收工作。基本思想: 寻找不再使用的对象,将他们从内存中删除,并压实托管堆以释放不在使用的对象所占用的内存。在堆被压实之后,所有的对象引用都被调整为指向对象新的存储位置。

垃圾回收机制的功能:用来管理托管资源和非托管资源所占用的内存分配和释放。 

1垃圾回收时也往往是同一批处理或 遵循:后分配,先释放原则。

.net框架的垃圾回收器被称为分代的垃圾回收器,也就是被分配的内存分为三个类别(生存期等级)/三代,即0,1,2三代,对应托管堆得初始化大小分别是256k,2m和10m.

当然,这种分配方式的效率也是最高的。而普通的堆对于内存分配是基于内存块大小的,两个同时声明的对象在普通堆上被分配的位置可能相隔较远,于是降低了缓存的性能。所以,在一个不需要太多垃圾回收的应用程序中,托管堆的表现会优于传统的堆。
下面来学习使用终结器[ Finalize()方法]
Protected void Finalize( ) {   Base.Finalize();    }
类提供一个终结器以在对象被销毁时执行,值得注意的是:当一个对象实现了Finalize方法,垃圾回收器会在它的终结列表(Finalization List)中加入一个指向该对象的指针(终结列表中包含的是等待终结的对象)。
等到此轮垃圾回收开始时,垃圾回收器会将该对象的引用置入终结列表,标识此对象为等待终结的对象,虽然此对象现在仍然存在,但是在应用程序中已经引用不到该对象了。垃圾回收器在此轮使用一个专用的线程,使终结列表中的对象执行终结器,执行完终结器的对象会被此对象标记为不再需要终结的对象,并从终结列表中除去。

终结完成后,对象所占用的资源将在下一轮垃圾回收中被回收。

六 在什么情况下会用到虚方法(虚函数)?它与接口有什么不同?

什么是虚函数:指明某个成员函数具有多态性,用关键字virtual来标志其为虚函数。什么时候用到虚函数:使用虚函数就是在父类中把子类中共有的但却易于变化或者不清楚的特征抽取出来,作为子类需要重新实现的操作(override).

例子:cass 飞禽

       {public string wing;//翅膀 public string feather;//羽毛 public virtral boolfly(){//空下来让子类去实现}}

         class 麻雀:飞禽

      {//定义麻雀自己特有的属性和行为public override boolfly(){//实现麻雀飞的动作}}

 虚函数和接口:一丝联系还得从多态的种类说起。多态的种类有两种,1为基类继承多态。(是基于类)2接口继承多态。(是基于can do)

原文地址:https://www.cnblogs.com/Ilin631/p/1860540.html